Skocz do zawartości

  • Zaloguj korzystając z Facebooka Zaloguj korzystając z Twittera Zaloguj przez Steam Zaloguj poprzez Google      Logowanie »   
  • Rejestracja

Witamy w Nieoficjalnym polskim support'cie AMX Mod X

Witamy w Nieoficjalnym polskim support'cie AMX Mod X, jak w większości społeczności internetowych musisz się zarejestrować aby móc odpowiadać lub zakładać nowe tematy, ale nie bój się to jest prosty proces w którym wymagamy minimalnych informacji.

  • Rozpoczynaj nowe tematy i odpowiedaj na inne
  • Zapisz się do tematów i for, aby otrzymywać automatyczne uaktualnienia
  • Dodawaj wydarzenia do kalendarza społecznościowego
  • Stwórz swój własny profil i zdobywaj nowych znajomych
  • Zdobywaj nowe doświadczenia

Dołączona grafika Dołączona grafika

Guest Message by DevFuse
 

Zdjęcie

Plugin generujący niewidzialne ściany. Pomocy!


  • Zamknięty Temat jest zamknięty
21 odpowiedzi w tym temacie

#1 csskill

    Życzliwy

  • Użytkownik

Reputacja: 0
zer0.

  • Postów:25
Offline

Napisano 14.06.2010 15:39

Witam.

Mam następujący problem:
1. Wzorując się na pluginie: AMX_Wall_Maker usiłowałem napisać własny plugin rysujący niewidzialna ścianę o danych współrzędnych

public wallCreate(id, level, cid) {
g_wallCount = g_wallCount + 1

new tmpWall
tmpWall = create_entity("info_target") // Tworzy przedmiot zwraca jej index
entity_set_string(tmpWall, EV_SZ_classname, "AMX_Wall_Maker") // Nazwa klasy tworzenia modelu
entity_set_model(tmpWall, "models/wall.mdl") // wybór modelu

new Float:MinBox[3]
new Float:MaxBox[3]

MinBox[0] = -2215.60
MinBox[1] = -2885.05
MinBox[2] = -125.0
MaxBox[0] = 10.0
MaxBox[1] = 85.0
MaxBox[2] = 125.0

entity_set_vector(tmpWall, EV_VEC_mins, MinBox)
entity_set_vector(tmpWall, EV_VEC_maxs, MaxBox)
entity_set_vector(tmpWall, EV_VEC_absmin, MinBox)
entity_set_vector(tmpWall, EV_VEC_absmax, MaxBox)

entity_set_origin(tmpWall, PlayerOrigin) //-> rysowanie modelu na graczu

// g_wallEnts[g_wallCount] = tmpWall
// g_wallCreators[g_wallCount] = id

entity_set_int(tmpWall, EV_INT_solid, 2) //Zmiana twardości ściany
entity_set_int(tmpWall, EV_INT_movetype, 4) //przez ścianę nie można przenikać , ściana nieruchoma xD

return PLUGIN_HANDLED
}


Czy ktoś jest w stanie przerobić tą funkcję albo wytłumaczyć mi na jakiej zasadzie mam wyznaczać rozmiar/ położenie generowanej ściany?!

Za pomoc będę zobowiązany :)

W zasadzie nie wiem tylko do czego służą te funkcję (poniżej), wiem, wiem można się domyślać próbować jednakże chciałem prosić Was forumowiczów o pomoc :)

entity_set_vector(tmpWall, EV_VEC_mins, MinBox)
entity_set_vector(tmpWall, EV_VEC_maxs, MaxBox)
entity_set_vector(tmpWall, EV_VEC_absmin, MinBox)
entity_set_vector(tmpWall, EV_VEC_absmax, MaxBox)


  • +
  • -
  • 0
Najlepsze serwery c-s:

Dołączona grafika

#2 grankee

    Godlike

  • Support Team

Reputacja: 507
Wszechwiedzący

  • Postów:1500
  • Lokalizacja:Radom
Offline

Napisano 15.06.2010 12:09

Zaraz coś przygotuję :P
  • +
  • -
  • 0

#3 csskill

    Życzliwy

  • Autor tematu
  • Użytkownik

Reputacja: 0
zer0.

  • Postów:25
Offline

Napisano 15.06.2010 12:36

Będę wdzięczny :)

Zaraz coś przygotuję :P


  • +
  • -
  • 0
Najlepsze serwery c-s:

Dołączona grafika

#4 grankee

    Godlike

  • Support Team

Reputacja: 507
Wszechwiedzący

  • Postów:1500
  • Lokalizacja:Radom
Offline

Napisano 15.06.2010 13:36


new Float:origin[3]={3376.0,-1200.0,-500.0}
new Float:vSizeMin[3]={-0.0,-0.0,-4.0};
new Float:vSizeMax[3]={200.0,2100.0,20.0};// oczywiście te dane są przykładowe, wyciągnięte z mojego pluginu, który kiedyś pisałem. Możesz obczaić działanie na mapie de_prodigy, tam gdzie spada się w przepaść będzie teraz umieszczona ściana.
entity_set_string(qq,EV_SZ_classname,"grankee_wall")
entity_set_int(qq, EV_INT_solid, SOLID_BBOX);
entity_set_model(qq,"models/wall.mdl")
entity_set_size(qq,vSizeMin,vSizeMax)
entity_set_origin(qq,origin)


Potrzebny Ci będzie programik google sketchup (darmowy, mało waży), aby obejrzeć w trójwymiarze to co przygotowałem.

Google sketchup:
http://sketchup.goog...load/index.html

Pliczek z rysunkiem 3D w załączniku.

Załączone pliki

  • Załączony plik  Entity.rar   468,25 KB  39 Ilość pobrań

Użytkownik grankee edytował ten post 15.06.2010 13:38

  • +
  • -
  • 0

#5 csskill

    Życzliwy

  • Autor tematu
  • Użytkownik

Reputacja: 0
zer0.

  • Postów:25
Offline

Napisano 15.06.2010 14:48

 	new Float:origin[3]={3376.0,-1200.0,-500.0} 	new Float:vSizeMin[3]={-0.0,-0.0,-4.0}; 	new Float:vSizeMax[3]={200.0,2100.0,20.0};// oczywiście te dane są przykładowe, wyciągnięte z mojego pluginu, który kiedyś pisałem. Możesz obczaić działanie na mapie de_prodigy, tam gdzie spada się w przepaść będzie teraz umieszczona ściana. 	entity_set_string(qq,EV_SZ_classname,"grankee_wall") 	entity_set_int(qq, EV_INT_solid, SOLID_BBOX); 	entity_set_model(qq,"models/wall.mdl") 	entity_set_size(qq,vSizeMin,vSizeMax) 	entity_set_origin(qq,origin)


Nie znam tego programu ale udało mi się otworzyć :)

Czy możesz mi omówić zasadę tworzenia takiej ściany?
Oraz jej usuwania?

Do czego służą liczby zapisane w tych zmiennym (dokładnie i łopatologicznie) ?

new Float:origin[3]={3376.0,-1200.0,-500.0} - położenie (środka ściany)?
new Float:vSizeMin[3]={-0.0,-0.0,-4.0}; - rozmiar ściany ?
new Float:vSizeMax[3]={200.0,2100.0,20.0}; - rozmiar ściany ?

Przyznaję się bez bicia że entity są mi obce jednak ta ściana jest mi niezbędna do ukończenia mojego pluginu :/

Chciałem wygenerować ścianę; dokładnie 4 ściany(sześcian bez dwóch przeciwległych podstaw) które tworzyły by strefę z której nie da się wyjść mogę podać współrzędne każdej ściany dla uwidocznienia ocb;
(podaję współrzędne punktu dwóch przeciwległych rogów ściany) należy doliczyć że ściana ma mieć grubość jak najcieńszą ~0

Ściana 1
2927.41, 2110.01, -1015.96 : -2214.47, 2107.93, -700.00
Ściana 2
-2214.47, 2107.93, -1015.96 : -2215.60, 2885.05, -700.00
Ściana 3
-2215.60, 2885.05, -1015.96 : 2926.02, 2883.59, -700.00
Ściana 4
2926.02, 2883.59, -1015.96 : 2927.41, 2110.01, -700.00


Wygląd:
### w załączniku wersja 3D i 2 D ###

Załączone miniatury

  • strefa.jpg

Załączone pliki


Użytkownik csskill edytował ten post 15.06.2010 17:23

  • +
  • -
  • 0
Najlepsze serwery c-s:

Dołączona grafika

#6 grankee

    Godlike

  • Support Team

Reputacja: 507
Wszechwiedzący

  • Postów:1500
  • Lokalizacja:Radom
Offline

Napisano 15.06.2010 19:11

Ścianę taką usuwasz poprzez uchwyt (numer entity zwracany przy jego tworzeniu przez funkcję create_entity()) funkcją remove_entity(ent).

Mapa do jedna wielka bryła, sześcian o krawędzi długości 19998u (u->unit - jednostka miary w csie).
Origin takiej mapy to sam środeczek, jeden punkt o współrzędnych 0.0 0.0 0.0 i to te współrzędne są bazą dla każdego entity na mapie czyli lokalizacja każdego entity jest mierzona od punktu o współrzędnych 0.0 0.0 0.0 (originu mapy).
Czyli jak łatwo obliczyć mierząc mapę w dowolnym kierunku równoległym do dowolnej osi, z wektorem skierowanym w jedną z dwóch stron, długość maksymalna może wynośić 9999u. Jest to czysta teoria, bo w praktyce nie spotyka się takich map, Abes może nieco rozjaśni, bo wydaje mi się, że nawet by silnik takiej wielkiej mapy nie pociągnął.
Wiedząc, że w naszym przyszłym entity(ściana) zawarty jest punkt o przykładowych współrzędnych
Float:Origin[3]={10.0 10.0 10.0}
, jej początek w kolejnych osiach ma mieć następujące położenie:
Float:początek[3]={5.0,4.0,3.0}
a jej koniec następujące:
Float:koniec[3]={16.0,17.0,18.0}

Znamy już wszystkie dane współrzędne, aby takie entity ustawić.

new Float:vSizeMin[3],vSizeMax[3]
vSizeMin[0]=odległość między origin[0] a początek[0] czyli w naszym przypadku 5.0 (10.0-5.0=5.0)
analogicznie liczymy dla vSizeMin[1] , vSizeMin[2]
Tak samo obliczamy vSizeMax[0], ale tutaj już liczymy różnice nie między origin[0] i początek[0], ale między origin[0] a koniec[0]
analogicznie liczymy dla vSizeMax[1] , vSizeMax[2]


Masz to dokładnie rozrysowane na tym rysunku 3D który dałem w poprzednim poście.
Musisz wziąć po uwagę w obliczeniach że dany punkt początkowy może mieć ujemne współrzędne lub sam origin może takie mieć wtedy zmienia się sposób liczenia odległości początek->origin oraz origin->koniec z prostego odejmowania/dodawanie na nieco bardziej skomplikowane działania.

Co do podanych przez Ciebie rogów to raczej taka ściana nie będzie cienka. Ciekawi mnie, skąd wziąłeś takie współrzędne?

Użytkownik grankee edytował ten post 15.06.2010 19:13

  • +
  • -
  • 0

#7 csskill

    Życzliwy

  • Autor tematu
  • Użytkownik

Reputacja: 0
zer0.

  • Postów:25
Offline

Napisano 15.06.2010 21:38

Może zrobimy inaczej, przedstawię jak ja rozumiem tworzenie ściany wraz z przykładem a Ty grankee powiesz mi gdzie robię błąd ok?

A więc zaczynam od tworzenia modelu o danym rozmiarze będzie to sześcian ( w założeniu)

Współrzędne na których powinien powstać sześcian ( W załączniku zwizualizowałem to co chcę przekazać)

{Z tego co mi wiadomo z działu geometrii aby usytuować punkt w przestrzeni trójwymiarowej (3D) potrzebujemy 3 danych dla uproszczenia: x, y, z}
Załącznik uklad.png przedstawia układ współrzędnych w przestrzeni ... jak widać posiada on 3 wymiary ;]

Wiem również że do wyznaczenia sześcianu potrzebujemy dwóch punktów ( 6 danych ) przedstawia to pierwszy załącznik Ściana.png .

Funkcja:

entity_set_size ( index, Float:mins[3], Float:maxs[3] )

jak już wcześniej wspomniałeś pobiera index(obiektu który tworzymy funkcją create_entity), kolejne Float:mins[3], Float:maxs[3] to współrzędne dwóch punktów dzięki którym określamy wielkość obiektu jaki zostanie stworzony.
Ściana.png
Ponieważ takie są współrzędne punktów tworzących ścianę:

punk1[3] = { -2214.47, 2107.93, -1015.96}
punk2[3] = {-2215.60, 2885.05, -700}

łatwo obliczamy jakie są potrzebne wielkości do stworzenia ściany
x =-2214.47 - -2215.60 = 1.13
y = 2885.05 - 2107.93 = 777.12
z = -700.00 - - 1015.96 = 315.96

Teraz będziemy właściwie obliczać dane jakie wpiszemy do mins[3] oraz maxs[3] dzieląc te dane na pół i wpisujemy tak aby punkt (0,0,0)-figury znajdował się dokładnie w punkcie środka symetrii tworzonego sześcianu {pomoże to ustawieniu figury w odpowiednim miejscu} więc czas na kolejne obliczenia:
x1 = x/2 = 0.57
y1 = y/2 = 388.56
z1 = z/2 = 157.98
teraz uzupełniamy zmienne mins[3] oraz maxs[3] danymi według przykładu niżej:

mins[0] = -x1
mins[1] = -y1
mins[2] = -z1
maxs[0] = x1
maxs[1] = y1
maxs[2] = z1

Dane jakie my wyszły:

mins[3] = { -0.57, -388.56, -157.98}
maxs[3] = {0.57, 388.56, 157.98}

Teraz użycie funkcji:
entity_set_size ( index, Float:mins[3], Float:maxs[3] )

Spowoduje utworzenie w pamięci następującego sześcianu (jeszcze nie został wygenerowany, umieszczony na mapie!)
Ściana2.png { na obrazku pomyliłem nazwy zmiennych (Maxbox to maxs a Minbox to mins) ale każdy będzie wiedzieć ocb}

Teraz dzięki użyciu funkcji:
entity_set_origin( index, ObjectOrigin[3])
umieszczamy {Środek symetrii} obiektu index w wyznaczonych zmiennych w przestrzeni (na mapie).
Użycie tutaj zwrotu "Środek symetrii" jest umyślne ponieważ wcześniej wyliczałem specjalnie dane tak aby punkt (obiektu) 0,0,0 znalazł się w środku symetrii tego obiektu!

Następnie wyliczamy miejsce w przestrzeni (na mapie) w którym ma się znaleźć środek symetrii obiektu;
ObjectOrigin[0] = punk1[0] + mins[0] = -2214.47 + -0.57 = -2 215.04
ObjectOrigin[1] = punk1[1] + maxs[1] = 2107.93 + 388.56 = 2 496.49
ObjectOrigin[2] = punk1[2] + maxs[2] = -1015.96 + 157.98 = -857.98

Czyli funkcja generująca ścianę powinna wyglądać tak:

[b]new qq;[/b]
[b]new Float:origin[3]={-2215.04,-2496.49,-857.98}
new Float:mins[3] = { -[/b][b][b]0.57[/b], -[/b][b][b]388.56[/b], -[/b][b][b]157.98[/b]};
new Float:maxs[3] = {  [/b][b][b]0.57[/b], [/b][b][b]388.56[/b], [/b][b][b]157.98[/b]};[/b]
[b]	
	entity_set_string(qq,EV_SZ_classname,"grankee_wall")
	entity_set_int(qq, EV_INT_solid, SOLID_BBOX);
	entity_set_model(qq,"models/wall.mdl")
	entity_set_size(qq,mins,maxs)
	entity_set_origin(qq,origin)[/b]

Jeśli napisałem dobrze to proszę powiedz jeśli źle to w miarę możliwości wytłumacz mój błąd.

Niestety jutro rano o godz 4 wyjeżdżam na działkę i wracam dopiero w piątek z rana będę s powrotem i będę mógł odpisać z góry thx za pomoc :)
  • +
  • -
  • 0
Najlepsze serwery c-s:

Dołączona grafika

#8 R3X

    Godlike

  • Przyjaciel

Reputacja: 2960
Godlike

  • Postów:4247
  • Lokalizacja:Nie
Offline

Napisano 15.06.2010 22:08

Origin to punkt, od którego przeliczana jest pozycja obiektu. Potrzebne są 2 punkty w przestrzeni, aby rozpiąć na nich prostopadłościan. Te punkty to origin[]+mins[] i origin[]+maxs[]. W załączniku to samo tylko w 2D

Jeśli byt ma model to wartości mins i maxs są jego rozmiarami, można odczytać z ModelViewera :)

Wizualne strony bytu to rendering. Renderować można model lub sprite.

Załączone miniatury

  • sth.jpg

  • +
  • -
  • 0

#9 grankee

    Godlike

  • Support Team

Reputacja: 507
Wszechwiedzący

  • Postów:1500
  • Lokalizacja:Radom
Offline

Napisano 15.06.2010 23:21

Niepotrzebnie komplikujesz sobie sprawę. Jeśli ściana ma być niewidzialna to bez znaczenia jest gdzie umieścisz origin bytu. Niech będzie on jednym rogiem, np. tym, który tutaj jest Twoim minsem, wtedy liczenie sizemin masz z głowy, bo będzie to 0.0 0.0 0.0, pozostanie Ci na podstawie długości każdego boku obliczyć SizeMax i wszystko w tym temacie. Postaram się na dniach zacząć robić tutorial o właściwościach i danych entity.

Użytkownik grankee edytował ten post 15.06.2010 23:22

  • +
  • -
  • 0

#10 csskill

    Życzliwy

  • Autor tematu
  • Użytkownik

Reputacja: 0
zer0.

  • Postów:25
Offline

Napisano 16.06.2010 03:34

Origin to punkt, od którego przeliczana jest pozycja obiektu. Potrzebne są 2 punkty w przestrzeni, aby rozpiąć na nich prostopadłościan. Te punkty to origin[]+mins[] i origin[]+maxs[]. W załączniku to samo tylko w 2D

Jeśli byt ma model to wartości mins i maxs są jego rozmiarami, można odczytać z ModelViewera :)

Wizualne strony bytu to rendering. Renderować można model lub sprite.


Czyli ogólnie rzecz biorąc dobrze napisałem ocb, jak napiszę kod to rzucił byś w wolnej chwili na niego.
Niestety zaraz wyjeżdżam i będę prawdopodobnie odcięty od świata do piątku.
Wczoraj w nocy już napisałem go ale niestety po próbie wygenerowania ściany serwer crash a konsola "Host_Error: backwards mins/maxs".
Mam nadzieję że w tym tutku opiszesz coś więcej niż tylko generowanie ścian :P

Pozfrawiam i do zobaczenia w piątek :P <papa>
  • +
  • -
  • 0
Najlepsze serwery c-s:

Dołączona grafika

#11 Vertricus

    Godlike

  • Przyjaciel

Reputacja: 426
Wszechobecny

  • Postów:1549
  • Lokalizacja:.
Offline

Napisano 16.06.2010 08:13

WalkGuard PL - Nieoficjalny polski support AMX Mod X
Tworzysz -> w menu wybierasz zablokuj wszystkich -> save :>
Have fun ;d
  • +
  • -
  • 0

#12 csskill

    Życzliwy

  • Autor tematu
  • Użytkownik

Reputacja: 0
zer0.

  • Postów:25
Offline

Napisano 18.06.2010 09:36

WalkGuard PL - Nieoficjalny polski support AMX Mod X
Tworzysz -> w menu wybierasz zablokuj wszystkich -> save :>
Have fun ;d


Ja nie tworzę stref dla camperów ja tworzę "strefę" do której przenoszę graczy .

Niestety dalej coś mi nie wychodzi:

public tele() {
	new qq[4];
	new Float:origin[4][3];
	origin[0]={-2931.05,2108.00,-1015.00}
	origin[1]={-2208.00,2108.00,-1015.00}
	origin[2]={-2919.05,2884.00,-1015.00}
	origin[3]={-2919.05,2108.00,-1015.00}

	new Float:mins[3] = { 0.00, 0.00, 0.00};
	new Float:maxs[4][3];
	maxs[0] = {  1.00, 676.00, 100.00};
	maxs[1] = {  711.05, 1.00, 100.00};
	maxs[2] = {  1.00, 676.00, 100.00};
	maxs[3] = {  711.05, 1.00, 100.00};
	
	for(new a = 0; a <= 4; a++){
	entity_set_string(qq[a],EV_SZ_classname,"grankee_wall")
	entity_set_int(qq[a], EV_INT_solid, SOLID_BBOX);
	entity_set_model(qq[a],"models/wall.mdl")
	entity_set_size(qq[a],mins,maxs[a])
	entity_set_origin(qq[a],origin[a])
	
	entity_set_vector(tmpWall, EV_VEC_absmin, MinBox)
	entity_set_vector(tmpWall, EV_VEC_absmax, MaxBox)
	
	entity_set_int(qq[a], EV_INT_solid, 0)
	entity_set_int(qq[a], EV_INT_movetype, 0) 
	}
}

Tworzy się ściana wielkości modelu {niecałe 70J szerokości (potrzebuję 676 i 711)} zna ktoś funkcję na rozszerzenie modelu?
Istnieje funkcja do wyłączenia przenikania przez model (jak normalna ściana)?
W jakim programie mogę utworzyć model przezroczystej ściany (plik *.mdl)?
  • +
  • -
  • 0
Najlepsze serwery c-s:

Dołączona grafika

#13 G[o]Q

    I'm G[o]Q

  • Przyjaciel

Reputacja: 1339
Godlike

  • Postów:3556
  • Steam:steam
  • Imię:Krzysiek
  • Lokalizacja:C: / program Files / Valve / Cstrike / G[o]Q.dem
Offline

Napisano 18.06.2010 13:08

hmm dobrze jest najpierw stworzyc entity uzywajac create_entity zapisac 4 id bytow do tablicy i im ustawiac dopiero wspolrzedne i wszystko xP

18 czerwiec 2010 - 14:08:
a co do min i max to jesli dobrze zrozumialem post R3X'a to moga byc one takie same dla kazdej sciany
  • +
  • -
  • 0
Manual ponad wszystko, konsola ponad manual :D :&

Chcesz wysłać do mnie PW ? użyj nazwy GoQ zamiast G[o]Q
Chcesz Kupić moduł płatności via Pukawka,Tserwery, Gamesol, Zabijaka do mojego sklepu? napisz PW cena to tylko 10 zł/sztuka

GG:6022845 (nie pomagam za free osobom ponizej rangi MoD) :D

#14 csskill

    Życzliwy

  • Autor tematu
  • Użytkownik

Reputacja: 0
zer0.

  • Postów:25
Offline

Napisano 18.06.2010 13:13


hmm dobrze jest najpierw stworzyc entity uzywajac create_entity zapisac 4 id bytow do tablicy i im ustawiac dopiero wspolrzedne i wszystko xP

18 czerwiec 2010 - 14:08:
a co do min i max to jesli dobrze zrozumialem post R3X'a to moga byc one takie same dla kazdej sciany


Wiem że wygląda dobrze ale sam spójrz w załącznik:
Generowanie.png
To miała być cała ściana ... nie ma ani wysokości jaką ustawiłem ani szerokości chociarz grubośc 1J się zgadza <lol2>.
  • +
  • -
  • 0
Najlepsze serwery c-s:

Dołączona grafika

#15 G[o]Q

    I'm G[o]Q

  • Przyjaciel

Reputacja: 1339
Godlike

  • Postów:3556
  • Steam:steam
  • Imię:Krzysiek
  • Lokalizacja:C: / program Files / Valve / Cstrike / G[o]Q.dem
Offline

Napisano 18.06.2010 13:22

nie wiem czy wiez ale model to nie textura ktora sobie mozesz zapchac dany obszar ty chcesz jeden model rozciagnac a to jesli sie da to sie robi inaczej (pev_scale ale tego nie sprawdzalem)
  • +
  • -
  • 0
Manual ponad wszystko, konsola ponad manual :D :&

Chcesz wysłać do mnie PW ? użyj nazwy GoQ zamiast G[o]Q
Chcesz Kupić moduł płatności via Pukawka,Tserwery, Gamesol, Zabijaka do mojego sklepu? napisz PW cena to tylko 10 zł/sztuka

GG:6022845 (nie pomagam za free osobom ponizej rangi MoD) :D

#16 csskill

    Życzliwy

  • Autor tematu
  • Użytkownik

Reputacja: 0
zer0.

  • Postów:25
Offline

Napisano 18.06.2010 14:39


nie wiem czy wiez ale model to nie textura ktora sobie mozesz zapchac dany obszar ty chcesz jeden model rozciagnac a to jesli sie da to sie robi inaczej (pev_scale ale tego nie sprawdzalem)


Jak mogę ustawić żeby nie można było przejść przez tą ścianę?
  • +
  • -
  • 0
Najlepsze serwery c-s:

Dołączona grafika

#17 R3X

    Godlike

  • Przyjaciel

Reputacja: 2960
Godlike

  • Postów:4247
  • Lokalizacja:Nie
Offline

Napisano 18.06.2010 15:28

Ustaw odpowiedni SOLID

np.
entity_set_int(ent, EV_INT_solid, SOLID_BBOX);

  • +
  • -
  • 0

#18 csskill

    Życzliwy

  • Autor tematu
  • Użytkownik

Reputacja: 0
zer0.

  • Postów:25
Offline

Napisano 18.06.2010 15:46

Ustaw odpowiedni SOLID

np.

entity_set_int(ent, EV_INT_solid, SOLID_BBOX);


Ok thx przetestuję i odezwę się :)
  • +
  • -
  • 0
Najlepsze serwery c-s:

Dołączona grafika

#19 Owner123

    Wszechpomocny

  • Użytkownik

Reputacja: 144
Zaawansowany

  • Postów:331
  • Lokalizacja:Barty ;]
Offline

Napisano 18.06.2010 15:54

entity_set_int(qq[a], EV_INT_solid, SOLID_BBOX)


@edit
Grr ... Nie zdazylem ~~ Można usunąć.

Użytkownik Owner123 edytował ten post 18.06.2010 15:55

  • +
  • -
  • 0

#20 csskill

    Życzliwy

  • Autor tematu
  • Użytkownik

Reputacja: 0
zer0.

  • Postów:25
Offline

Napisano 20.06.2010 10:12

entity_set_int(qq[a], EV_INT_solid, SOLID_BBOX) 


@edit
Grr ... Nie zdazylem ~~ Można usunąć.


Albo ja aż tak ni ogarniam tych funkcji z engine albo jest coś nie tak :/

@edit2

Po całym dniu spędzonym na studiowaniu języka pawn konkretnie użycia funkcji z "engine" oraz tworzeniu modeli do cs udało mi się wymodzić następujący kod:

public wallCreate() {

	new Float:MinBox[3]
	new Float:MaxBox[3]
	new Float:PlayerOrigin[3]
	
	tmpWall[0] = create_entity("info_target")
	entity_set_string(tmpWall[0], EV_SZ_classname, "AMX_Wall_Maker")
	entity_set_model(tmpWall[0], "models/wall.mdl")
	
	MinBox[0] = 0.0
	MinBox[1] = 0.0
	MinBox[2] = 0.0
	MaxBox[0] = 711.0
	MaxBox[1] = 1.0
	MaxBox[2] = 350.0
		
	entity_set_vector(tmpWall[0], EV_VEC_mins, MinBox)
	entity_set_vector(tmpWall[0], EV_VEC_maxs, MaxBox)
	entity_set_vector(tmpWall[0], EV_VEC_absmin, MinBox)
	entity_set_vector(tmpWall[0], EV_VEC_absmax, MaxBox)
		
	PlayerOrigin[0] = -2919.0
	PlayerOrigin[1] = 2108.0
	PlayerOrigin[2] = -1015.5

	entity_set_origin(tmpWall[0], PlayerOrigin)
	entity_set_int(tmpWall[0], EV_INT_solid, 2)
	entity_set_int(tmpWall[0], EV_INT_movetype, 4)

	tmpWall[1] = create_entity("info_target")
	entity_set_string(tmpWall[1], EV_SZ_classname, "AMX_Wall_Maker")
	entity_set_model(tmpWall[1], "models/wall.mdl")
	
	MinBox[0] = 0.0
	MinBox[1] = 0.0
	MinBox[2] = 0.0
	MaxBox[0] = 1.0
	MaxBox[1] = 766.0
	MaxBox[2] = 1250.0
		
	entity_set_vector(tmpWall[1], EV_VEC_mins, MinBox)
	entity_set_vector(tmpWall[1], EV_VEC_maxs, MaxBox)
	entity_set_vector(tmpWall[1], EV_VEC_absmin, MinBox)
	entity_set_vector(tmpWall[1], EV_VEC_absmax, MaxBox)
		
	PlayerOrigin[0] = -2208.0
	PlayerOrigin[1] = 2110.0
	PlayerOrigin[2] = -1015.5

	entity_set_origin(tmpWall[1], PlayerOrigin)
	entity_set_int(tmpWall[1], EV_INT_solid, 2)
	entity_set_int(tmpWall[1], EV_INT_movetype, 4)
	
	tmpWall[2] = create_entity("info_target")
	entity_set_string(tmpWall[2], EV_SZ_classname, "AMX_Wall_Maker")
	entity_set_model(tmpWall[2], "models/wall.mdl")
	
	MinBox[0] = 0.0
	MinBox[1] = 0.0
	MinBox[2] = 0.0
	MaxBox[0] = 711.0
	MaxBox[1] = 1.0
	MaxBox[2] = 350.0
		
	entity_set_vector(tmpWall[2], EV_VEC_mins, MinBox)
	entity_set_vector(tmpWall[2], EV_VEC_maxs, MaxBox)
	entity_set_vector(tmpWall[2], EV_VEC_absmin, MinBox)
	entity_set_vector(tmpWall[2], EV_VEC_absmax, MaxBox)
		
	PlayerOrigin[0] = -2919.0
	PlayerOrigin[1] = 2884.0
	PlayerOrigin[2] = -1015.5

	entity_set_origin(tmpWall[2], PlayerOrigin)
	entity_set_int(tmpWall[2], EV_INT_solid, 2)
	entity_set_int(tmpWall[2], EV_INT_movetype, 4)
	
	tmpWall[3] = create_entity("info_target")
	entity_set_string(tmpWall[3], EV_SZ_classname, "AMX_Wall_Maker")
	entity_set_model(tmpWall[3], "models/wall.mdl")
	
	MinBox[0] = 0.0
	MinBox[1] = 0.0
	MinBox[2] = 0.0
	MaxBox[0] = 1.0
	MaxBox[1] = 766.0
	MaxBox[2] = 350.0
		
	entity_set_vector(tmpWall[3], EV_VEC_mins, MinBox)
	entity_set_vector(tmpWall[3], EV_VEC_maxs, MaxBox)
	entity_set_vector(tmpWall[3], EV_VEC_absmin, MinBox)
	entity_set_vector(tmpWall[3], EV_VEC_absmax, MaxBox)
		
	PlayerOrigin[0] = -2919.0
	PlayerOrigin[1] = 2108.0
	PlayerOrigin[2] = -1015.5

	entity_set_origin(tmpWall[3], PlayerOrigin)
	entity_set_int(tmpWall[3], EV_INT_solid, 2)
	entity_set_int(tmpWall[3], EV_INT_movetype, 4)
	
	return PLUGIN_HANDLED
}

public wall_clear() {
	for(new y; y <= 3; y++)
	remove_entity(tmpWall[y])	
}

Niestety po dodaniu tych linijek do pluginu; system linux ("Debian 5.0") zaczął ciągle wywalać błąd: Naruszenia ochrony pamięci.

Kody błędu:

./hlds_run: line 321: 1537 Segmentation fault $HL_CMD
./hlds_run: line 321: 25751 Segmentation fault $HL_CMD


Plik hlds_run
#!/bin/sh
#
#   	Copyright (c) 2002, Valve LLC. All rights reserved.
#
#	a wrapper script for the main hl dedicated server binary.
#	Performs auto-restarting of the server on crash. You can
#	extend this to log crashes and more.
#

# setup the libraries, local dir first!
export LD_LIBRARY_PATH=".:$LD_LIBRARY_PATH"

init() {
	# Initialises the various variables
	# Set up the defaults
	GAME="valve"
	DEBUG=0
	RESTART="yes"
	HL=./hlds_i486
	HL_DETECT=1
	TIMEOUT=10 # time to wait after a crash (in seconds)
	CRASH_DEBUG_MSG="email debug.log to linux@valvesoftware.com"
	GDB="gdb" # the gdb binary to run
	DEBUG_LOG="debug.log"
	PID_FILE=""
	STEAM=""
	STEAMERR=""
	SIGINT_ACTION="quit 0" # exit normally on sig int
	NO_TRAP=0
	AUTO_UPDATE=""
	BETA_VERSION=""
	PARAMS=$*

	# Remove any old default pid files
	# Cant do this as they may be still running
	#rm -f hlds.*.pid

	# use the $FORCE environment variable if its set
	if test -n "$FORCE" ; then
		# Note: command line -binary will override this
		HL=$FORCE
		HL_DETECT=0
	fi

	while test $# -gt 0; do
		case "$1" in
		"-game")
			GAME="$2"
			shift ;;
		"-debug")
			DEBUG=1
			# Ensure that PID_FILE is set
			if test -z "$PID_FILE"; then
				PID_FILE="hlds.$$.pid"
			fi ;;
		"-norestart")
			RESTART="" ;;
		"-pidfile")
			PID_FILE="$2"
			shift ;;
		"-binary")
			HL="$2"
			HL_DETECT=0
			shift ;;
		"-timeout")
			TIMEOUT="$2"
			shift ;;
		"-gdb")
			GDB="$2"
			shift ;;
		"-debuglog")
			DEBUG_LOG="$2"
			shift ;;
		"-autoupdate")
			AUTO_UPDATE="yes"
			STEAM="./steam"
			RESTART="yes" ;;
		"-steamerr")
			STEAMERR=1 ;;
		"-ignoresigint")
			SIGINT_ACTION="" ;;
		"-notrap")
			NO_TRAP=1 ;;
		"-beta")
			BETA_VERSION="$2"
			shift ;;
		"-help")
			# quit with syntax
			quit 2
			;;
		esac
		shift
	done

	# Ensure we have a game specified
	if test -z "$GAME"; then
		echo "Unable to determine game type from command line."
		quit 1
	elif test ! -d "$GAME"; then
		echo "Invalid game type '$GAME' sepecified."
		quit 1
	fi

	if test 0 -eq "$NO_TRAP"; then
		# Set up the int handler
		# N.B. Dont use SIGINT symbolic value
		#  as its just INT under ksh
		trap "$SIGINT_ACTION" 2
	fi

	# Only detect the CPU if it hasnt been set with
	# either environment or command line
	if test "$HL_DETECT" -eq 1; then
		detectcpu
	fi

	if test ! -f "$HL"; then
		echo "Half-life binary '$HL' not found, exiting"
		quit 1
	elif test ! -x "$HL"; then
		# Could try chmod but dont know what we will be
		# chmoding so just fail.
		echo "Half-life binary '$HL' not executable, exiting"
		quit 1
	fi

	# Setup debugging
	if test "$DEBUG" -eq 1; then
		#turn on core dumps :) (if possible)
		echo "Enabling debug mode"
		if test "`ulimit -c`" -eq 0 ; then
			ulimit -c 2000
		fi
		GDB_TEST=`$GDB -v`
		if test -z "$GDB_TEST"; then
			echo "Please install gdb first."
			echo "goto http://www.gnu.org/software/gdb/ "
			DEBUG=0 # turn off debugging cause gdb isn't installed
		fi
	fi

	PID_IN_PARAMS="`echo $PARAMS | grep -e -pidfile`"

	if test -z "$PID_IN_PARAMS" && test -n "$PID_FILE"; then
		HL_CMD="$HL $PARAMS -pidfile $PID_FILE"
	else
		HL_CMD="$HL $PARAMS"
	fi
}

syntax () {
	# Prints script syntax

	echo "Syntax:"
	echo "$0 [-game <game>] [-debug] [-norestart] [-pidfile]"
	echo "	[-binary [hlds_i486|hlds_i686|hlds_amd]"
	echo "	[-timeout <number>] [-gdb <gdb>] [-autoupdate]"
	echo "	[-steamerr] [-ignoresigint] [-beta <version>]"
	echo "  [-debuglog <logname>]"
	echo "Params:"
	echo "-game <game>    		Specifies the <game> to run."
	echo "-debug          		Run debugging on failed servers if possible."
	echo "-debuglog <logname>	Log debug output to this file."
	echo "-norestart      		Don't attempt to restart failed servers."
	echo "-pidfile <pidfile>  	Use the specified <pidfile> to store the server pid."
	echo "-binary <binary>		Use the specified binary ( no auto detection )."
	echo "-timeout <number>   	Sleep for <number> seconds before restarting"
	echo "			a failed server."
	echo "-gdb <gdb>      		Use <dbg> as the debugger of failed servers."
	echo "-steamerr 		  	Quit on steam update failure."
	echo "-beta <version>		Make use of a beta version of this server from Steam"
	echo "-ignoresigint   		Ignore signal INT ( prevents CTRL+C quitting"
	echo "			the script )."
	echo "-notrap         		Don't use trap. This prevents automatic"
	echo "			removal of old lock files."
	echo ""
	echo "Note: All parameters specified as passed through to the server"
	echo "including any not listed."
}

debugcore () {
	# Debugs any core file if DEBUG is set and
	# the exitcode is none 0

	exitcode=$1

	if test $exitcode -ne 0; then
		if test -n "$DEBUG" ; then 
			echo "bt" > debug.cmds;
			echo "info locals" >> debug.cmds;
			echo "info sharedlibrary" >> debug.cmds
			echo "info frame" >> debug.cmds;  # works, but gives an error... must be last
			echo "----------------------------------------------" >> $DEBUG_LOG
			echo "CRASH: `date`" >> $DEBUG_LOG
			echo "Start Line: $HL_CMD" >> $DEBUG_LOG

			# check to see if a core was dumped
			if test -f core ; then
				CORE="core"
			elif test -f core.`cat $PID_FILE`; then
				CORE=core.`cat $PID_FILE`
			elif test -f "$HL.core" ; then
				CORE="$HL.core"
			fi
			
			if test -n "$CORE"; then
				$GDB $HL $CORE -x debug.cmds -batch >> $DEBUG_LOG
			fi
		
			echo "End of crash report" >> $DEBUG_LOG
			echo "----------------------------------------------" >> $DEBUG_LOG
			echo $CRASH_DEBUG_MSG
			rm debug.cmds
		else
			echo "Add \"-debug\" to the $0 command line to generate a debug.log to help with solving this problem"
		fi
	fi
}

detectcpu() {
	# Attempts to auto detect the CPU
	echo "Auto detecting CPU"

	if test "FreeBSD" = `uname`; then
		PROC="/usr/compat/linux/proc"
	else
		PROC="/proc"
	fi

	if test -e $PROC/cpuinfo; then
		CPU_VERSION="`grep "cpu family" $PROC/cpuinfo | cut -f2 -d":" | tr -d " " | uniq`";
		if test $CPU_VERSION -lt 4; then
			echo "Error: hlds_l REQUIRES a 486 CPU or better";
			quit 1
		elif test $CPU_VERSION -ge 15; then
			# Core 2 or greater
			echo "Using AMD Optimised binary."
			HL=./hlds_amd
		elif test $CPU_VERSION -ge 6; then
			AMD="`grep AMD $PROC/cpuinfo`";
			if test -n "$AMD"; then
				echo "Using AMD Optimised binary."
				HL=./hlds_amd
			else
				echo "Using Pentium II Optimised binary."

				# there is a CPU manufactured by VIA that
				# doesn't support some PII instructions...
				# detect this.
				VIACHIP=`grep CentaurHauls $PROC/cpuinfo`
			
				if test -z "$VIACHIP"; then
					HL=./hlds_i686
				fi
			fi		
		else
			echo "Using default binary."
		fi
	elif test "FreeBSD" = `uname`; then
		CPU="`grep 'CPU:' /var/run/dmesg.boot`"
		AMD="`echo $CPU |grep AMD`"
		K8="`echo $CPU |grep K8`"
		I686="`echo $CPU |grep 686`"
		if test -n "$AMD"; then
			echo "Using AMD Optimised binary."
			HL=./hlds_amd
		elif test -n "$K8" ; then
			echo "Using AMD Optimised binary."
			HL=./hlds_amd
		elif test -n "$I686" ; then
			echo "Using Pentium II Optimised binary."
			HL=./hlds_i686
		else
			echo "Using default binary."
		fi
	else
		echo "Using default binary."
	fi
}

update() {
	updatesingle
}

updatesingle() {
	# Run the steam update
	# exits on failure if STEAMERR is set

	if test -n "$AUTO_UPDATE"; then
		if test -f "$STEAM"; then
			echo "Updating server using Steam."
			CMD="$STEAM -command update -game $GAME -dir ."; 
			if  test -n "$BETA_VERSION"; then
			  CMD="$CMD -beta $BETA_VERSION";
			fi

			$CMD
			if test $? -ne 0; then
				if test -n "$STEAMERR"; then
					echo "`date`: Steam Update failed, exiting."
					quit 1
				else
					echo "`date`: Steam Update failed, ignoring."
					return 0
				fi
			fi
		else
			if test -n "$STEAMERR"; then
				echo "Could not locate steam binary:$STEAM, exiting.";
				quit 1
			else
				echo "Could not locate steam binary:$STEAM, ignoring.";
				return 0
			fi
		fi
	fi

	return 1
}
	
run() {
	# Runs the steam update and server
	# Loops if RESTART is set
	# Debugs if server failure is detected
	# Note: if RESTART is not set then
	# 1. DEBUG is set then the server is NOT exec'd
	# 2. DEBUG is not set the the server is exec'd

	if test -n "$RESTART" ; then
		echo "Auto-restarting the server on crash"

		#loop forever
		while true
		do
			# Update if needed
			update

			# Run the server
			$HL_CMD
			retval=$?
			if test $retval -eq 0 && test -z "$AUTO_UPDATE"; then
				break; # if 0 is returned then just quit
			fi

			debugcore $retval

			echo "`date`: Server restart in $TIMEOUT seconds"

			# don't thrash the hard disk if the server dies, wait a little
			sleep $TIMEOUT
		done # while true 
	else
		# Update if needed
		update

		# Run the server
		if test "$DEBUG" -eq 0; then
			# debug not requested we can exec
			exec $HL_CMD
		else
			# debug requested we can't exec
			$HL_CMD
			debugcore $?
		fi
	fi
}

quit() {
	# Exits with the give error code, 1
	# if none specified.
	# exit code 2 also prints syntax
	exitcode="$1"

	# default to failure
	if test -z "$exitcode"; then
		exitcode=1
	fi

	case "$exitcode" in
	0)
		echo "`date`: Server Quit" ;;
	2)
		syntax ;;
	*)
		echo "`date`: Server Failed" ;;
	esac

	# Remove pid file
	if test -n "$PID_FILE" && test -f "$PID_FILE" ; then
		# The specified pid file
		rm -f $PID_FILE
	fi

	# reset SIGINT and then kill ourselves properly
	trap - 2
	kill -2 $$
}

# Initialise
init $*

# Run
run

# Quit normally
quit 0 

20 czerwiec 2010 - 11:12:
Odświeżam, jeśli temat zabrnął zbyt w tematykę HLDS proszę moderatora o przeniesienie ostatniego posta do odpowiedniego działu :P
Ale to jest raczej błąd ze złą optymalizacją części kodu ;P

Użytkownik csskill edytował ten post 20.06.2010 09:59

  • +
  • -
  • 0
Najlepsze serwery c-s:

Dołączona grafika




Użytkownicy przeglądający ten temat: 0

0 użytkowników, 0 gości, 0 anonimowych