Skocz do zawartości

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

Tworzenie i modyfikacja entity


  • Nie możesz napisać tematu
  • Zaloguj się, aby dodać odpowiedź
8 odpowiedzi w tym temacie

#1 grankee

    Godlike

  • Support Team

Reputacja: 517
Wszechwiedzący

  • Postów:1 500
  • Lokalizacja:Radom
Offline

Napisano 09.12.2014 15:20

*
Popularny

Witam. Postanowiłem trochę się rozpisać o entitach. Poradnik ten z założenia ma być długi i obszerny, a mój system pracy nie sprzyja więc czego nie skończę dziś, dopiszę jutro.
 
Entity to nic innego jak byty na mapie. Mapa (widzialna i namacalna bryła, wewnątrz której toczymy rozgrywkę wraz z jej wszystkimi elementami, które nie są odrębnymi bytami) sama w sobie też jest bytem o numerze 0.
Każde entity ma swój unikalny numer, raz nadany podczas tworzenia entity nigdy nie ulega zmianie. Oczywiście jeśli dany ent zostanie usunięty to jego numer zostaje "zwolniony" i może zostać on nadany kolejnemu entowi podczas jego tworzenia.
 
Entity posiada wiele właściwości, które z grubsza postaram się objaśnić. Podstawową sprawą jest, że ma kształt prostopadłościanu i jakiś model, czyli jakoś wygląda, ale model nie musi wcale się pokrywać z kształtem i wymiarami bytu. Do tworzenia lub modyfikacji tych właściwości możemy używać dwóch modułów - <engine> oraz <fakemeta>, jednak w tym tutorialu skupię się na tym pierwszym z prostego powodu - jest łatwiejszy i bardziej przejrzysty. Na koniec postaram się nie zapomnieć przedstawić przykładów użycia fakemety z tym samym skutkiem.
 
Do ustawiania właściwości entity używamy funkcji:
 
entity_set_byte(index,klucz,wartość)
entity_set_edict(index,klucz,wartość)
entity_set_float(index,klucz,Float:wartość)
entity_set_int(index,klucz,wartość)
entity_set_string(index,klucz,const wartość[])//tablica string
entity_set_vector(index,klucz,wartość)
 
 
ponadto:
 
entity_set_model(index,const sciezka_do_modelu[])
entity_set_origin(index,const Float:fNewOrigin[3])
entity_set_size(index,const Float:mins[3],const Float:maxs[3])
 
 
Te 3 ostatnie różnią się tym, że aktualizują zmienione dane w silniku gry. Koniecznie trzeba ich użyć, aby poprawnie stworzyć entity.
 
 
Pobierać te właściwości można funkcjami:
 
entity_get_byte(index,klucz)//zwraca returnem wartość typu int
entity_get_edict(index,klucz)//zwraca returnem wartość typu int
entity_get_float(index,klucz)//zwraca returnem wartość typu float
entity_get_int(index,klucz)//zwraca returnem wartość typu int
entity_get_string(index,klucz,tablica_znakow[],dlugosc_tablicy_znakow)//zwrot przez referencję do tablicy znaków podanej jako argument
entity_get_vector(index,klucz,tablica_float[3])//zwrot przez referencję do tablicy trójelementowej typu float
 
 
No dobra, ale co to jest ten klucz?
Jest to liczba całkowita określająca, którą właściwość chcemy sprawdzić/zmienić. Dla ułatwienia skorzystajmy z przygotowanych do tego elementów typu wyliczeniowego, dzięki czemu będziemy wiedzieli z grubsza co dany klucz nam zmieni. 
Każda funkcja ma przygotowany dla siebie typ wyliczeniowy, osobny dla byte,edict,float,int,string i vector(postaram się uzupełniać, może ktoś coś podpowie):
Spoiler
 
 
 
 
Podzielmy entity ze względu na klasę.
Pierwsza podstawowa klasa bez jakiej gra nie zainstnieje to
player
Więcej o graczu:
Spoiler
Dalej mamy najczęściej spotykane byty:
info_player_start - miejsce spawnu CT
info_player_deathmatch- miejsce spawnu Terro
func_buyzone - w jego wnętrzu można kupować
func_bomb_target - w jego wnętrzu można podkładać pakę
weapon_usp, weapon_glock i cała reszta broni - broń posiadana przez gracza
func_wall - ściana, ale nie tylko, paradoksalnie chyba żadna ściana nie jest bytem tej klasy tylko częścią mapy. Praktycznie każdy obiekt może być tej klasy(np. skrzynka, barierka...), są to obiekty nie pełniące żadnej roli specjalnej a jedynie mają być i istnieć.
func_breakable - obiekt, który da się zniszczyć np. szyba, kratka do wentylacji, skrzynki niszczone wybuchem bomby i wiele innych
func_illusionary - ma model, czyli jakoś wygląda, ale nie zatrzymuje pocisków, nie blokuje ruchu.
trigger_multiple - byt o solidzie 1 czyli SOLID_TRIGGER, jego dotknięcie alarmuje go, ale nie blokuje ruchu, zwykle alarmuje inny byt do wykonania thinku, czyli jakiejś czynności, np drzwi do otwarcia się na de_prodigy.
func_door - drzwi
func_door_rotating - drzwi obrotowe
func_ladder - drabina
trigger_hurt - rani po dotknięciu go
 
 
Postaram się coś jeszcze dopisać.
 
 
 
No to trochę teorii za nami, teraz pora stworzyć nasze entity:
Załóżmy, że potrzebna nam ściana, której ścieżka do modelu to "models/wall/wall.mdl"
new byt=create_entity("func_wall")//funkcja tworzy byt klasy func_wall, zwracając numer powstałego entity, który przypisujemy zmiennej 'byt'
entity_set_model(ent,"models/wall/wall.mdl")
new Float:mins[3],Float:maxs[3]//aby powstał prostopadłościan (takiego kształtu jest entity) musimy rozciągnąć go w przestrzeni za przeciwległe rogi i to właśnie odległości od originu do tych rogów
//odpowiednio do rogu najbardziej wysuniętego w kierunku ujemnym
mins[0]=-112.0//oś x
mins[1]=-113.0//oś y
mins[2]=-1.0//oś z (góra-dół)
//oraz najbardziej wysniętego w kierunku dodatnim
maxs[0]=115.0
maxs[1]=116.0
maxs[2]=117.0
entity_set_size(ent,mins,maxs)//ustawia w/w odległości-czyli po prostu rozmiar
new Float:origin[3]
entity_get_vector(id,EV_VEC_origin,origin)//tu pobieram położenie gracza, aby z grubsza wiedzieć gdzie to entity umieścić, jeśli mam własne dane co do położenia, 
//a nie interesuje nas położenie gracza, to przypisujemy dane do zmiennej origin[3]
origin[0]+=350.0//tu zmieniam położenie względem jednej z osi, żeby byt nie został stworzony na mnie (graczu) tylko w pobliżu
entity_set_origin(ent,origin)//ustawiam położenie bytu. Należy uważać, aby byt nie został stworzony w mapie, tzn jego część nie była schowana w podłodze, bo byt zacznie nam opadać powoli w dół aż zniknie całkowicie z pola widzenia. Dobrze ustawiony origin poskutkuje pojawieniem się nieruchomego bytu, ew pojawieniem się bytu i opadnięciem na ziemie.


entity_set_int(ent,EV_INT_solid,SOLID_BBOX)//ustawiamy dotykalność bytu (bez ustawionego movetype ( MOVETYPE_NONE ) nie przynosi efektu)
entity_set_int(ent,EV_INT_movetype,MOVETYPE_TOSS)//ustawiamy sposób poruszania się bytu, wybrany tutaj to po prostu kolidowanie z entitami, grawitacja
 
ważne, model musimy precachować:
public plugin_precache()
{
precache_model("models/wall/wall.mdl") 
}
Możliwe SOLIDy:
#define SOLID_NOT 0 /* Brak interakcji z obiektami */
#define SOLID_TRIGGER 1 /* Tworzy dotyk (alarmując funkcje), ale nie blokuje (można przez niego przejść) */
#define SOLID_BBOX 2 /* Tworzy dotyk (alarmując funkcje), blokuje */
#define SOLID_SLIDEBOX 3 /* Tworzy dotyk, ale nie na ziemi(nie czaje o co chodzi:P-nie testowałem) */
#define SOLID_BSP 4 /* Część mapy, tworzy dotyk (alarmując funkcje), blokuje */
Możliwe movetype'y:
#define MOVETYPE_NONE 0 /* nie porusza się */
#define MOVETYPE_ANGLENOCLIP 1 /* nie mam pojęcia - crashuje serwer jak ustawię */
#define MOVETYPE_ANGLECLIP 2 /* nie porusza się */
#define MOVETYPE_WALK 3 /* Tylko gracz tego używa - chodzenie po ziemi - ustawisz innemu entity=crash */
#define MOVETYPE_STEP 4 /* gravity, special edge handling -- monsters use this */
#define MOVETYPE_FLY 5 /* Koliduje z elementami mapy/entami, ale nie działa nań grawitacja */
#define MOVETYPE_TOSS 6 /* Koliduje z elementami mapy/entami, działa nań grawitacja */
#define MOVETYPE_PUSH 7 /* no clip to world, push and crush - nie testowałem, ale entity z solid_bsp mają ten movetype */
#define MOVETYPE_NOCLIP 8 /* Może posiadać prędkość tzn poruszać się, ale nie koliduje i nie działa nań grawitacja */
#define MOVETYPE_FLYMISSILE 9 /* extra size to monsters */
#define MOVETYPE_BOUNCE 10 /* Tak jak TOSS, ale odbija się od wszystkiego */
#define MOVETYPE_BOUNCEMISSILE 11 /* Odbija się, ale nie działa nań grawitacja */
#define MOVETYPE_FOLLOW 12 /* Śledzi ruchy celu (EV_ENT_aiment ?) */
#define MOVETYPE_PUSHSTEP 13 /* BSP model that needs physics/world collisions (uses nearest hull for world collision) */
 
Na koniec przełożenie na fakemete, np:
entity_set_int(id,EV_ENT_owner,1)
set_pev(id,pev_owner,1)
to jest to samo w działaniu, albo
entity_get_int(id,EV_ENT_owner)
pev(id,pev_owner)
albo
new classname[32]
entity_get_string(id,EV_SZ_classname,classname,31)
pev(id,pev_classname,classname,31)
 
 
 

 

Teraz już wiecie jak stworzyć swoje entity. Postaram się uzupełniać w wolnych chwilach, a także po waszych sugestiach i uwagach, na które bardzo liczę. Jak zbierzemy do kupy wiedzę paru osób to może powstać z tego na prawdę dobry poradnik.

Użytkownik grankee edytował ten post 10.12.2014 02:30

  • +
  • -
  • 16

#2 G[o]Q

    I'm G[o]Q

  • Przyjaciel

Reputacja: 1 344
Godlike

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

Napisano 09.12.2014 21:37

 

#define MOVETYPE_FOLLOW 12 /* Śledzi ruchy celu (EV_INT_owner ?) */

pev_aiment

 

i mysle ze fakemeta jest fajniejsza latwiejsza i ogólnie lepiej się z nią pracuje dodatkowo nie napisales nic o info_target reszta na + 

 

//size i origin zawsze ustawialem pev'em i bylo ok w sumie model chyba też xD


  • +
  • -
  • 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

#3 grankee

    Godlike

  • Autor tematu
  • Support Team

Reputacja: 517
Wszechwiedzący

  • Postów:1 500
  • Lokalizacja:Radom
Offline

Napisano 10.12.2014 02:34


#define MOVETYPE_FOLLOW 12 /* Śledzi ruchy celu (EV_INT_owner ?) */
pev_aiment
 

Poprawione.


i mysle ze fakemeta jest fajniejsza latwiejsza i ogólnie lepiej się z nią pracuje

Dla mnie teraz też, ale na początku engine był dla mnie bardziej przejrzysty, wiedziałem, że jak coś jest EV_INT to ma być liczba całkowita, jak EV_FL to float itd. Jak ktoś ogarnie to w engine to spokojnie sobie poradzi z przejściem na FM :)


dodatkowo nie napisales nic o info_target

Będę wdzięczny jak wtrącisz swoje 3 grosze i napiszesz parę słów na jego temat, bo sam nie bardzo wiem co to jest i komu to potrzebne :D


  • +
  • -
  • 0

#4 DarkGL

    Nie oddam ciasteczka !

  • Administrator

Reputacja: 6 553
Godlike

  • Postów:11 976
  • GG:
  • Steam:steam
  • Imię:Rafał
  • Lokalizacja:Warszawa
Offline

Napisano 10.12.2014 09:42

Popracuj trochę nad czytelnością tutorialu bo teraz tak jednym ciurkiem wszystko ciężko się czyta :P
  • +
  • -
  • 0

#5 he1st

    Diablo Mody i te sprawy ;3

  • Użytkownik

Reputacja: 132
Zaawansowany

  • Postów:357
  • GG:
  • Imię:Michał
  • Lokalizacja:Legionowo
Offline

Napisano 10.12.2014 13:38

Ale ogólnie poradnik bardzo fajny i moim zdaniem przyda mi się przy edycji paru mankamentów w diablo. ;)

 

+'ik


  • +
  • -
  • 0

b_350_20_000000_000000_FFFFFF_DA0707.png
b_350_20_000000_000000_FFFFFF_DA0707.png


#6 Skull.

    Wszechpomocny

  • Użytkownik

Reputacja: 70
Pomocny

  • Postów:314
  • Steam:steam
  • Imię:Tajemnica
  • Lokalizacja:Woj. Wielkopolskie
Offline

Napisano 18.03.2015 12:11

Takich przykładów podobnych przekładów nie raz szukałem  ^D^  ^D^  ^D^

:plus: Poleciał  ^D^


  • +
  • -
  • 0

#7 Eryk172

    Szukam niewiadomej

  • Użytkownik

Reputacja: 41
Pomocny

  • Postów:407
  • Steam:steam
  • Imię:Eryk
  • Lokalizacja:Dbn
Offline

Napisano 11.05.2016 09:42

	new entity = fm_create_entity("func_breakable")
	set_pev(entity, pev_classname, "wall")
	fm_entity_set_model(entity, "models/gib_skull.mdl")
	fm_entity_set_origin(entity, position)
	set_pev(entity, pev_movetype, MOVETYPE_FLY)
	new id = pev(entity, ZONEID)
        set_pev(entity, pev_solid, SOLID_BBOX)
	fm_entity_set_size(entity, mins, maxs)
	fm_set_entity_visibility(entity, 0)
	return entity

Jak stworzyć ścianę przez którą nie można strzelać?

Aktualnie nie można tylko przejść, a jak zrobić żeby kulki nie przelatywały


  • +
  • -
  • 0

CoD Mod - IP: 91.224.117.15:27235      
JailBreak  -   IP: 91.224.117.67:27075     
Only de_dust2 -   IP: 193.33.176.197:27111   

Więcej serwerów na: www.NaFarciePL


#8 grankee

    Godlike

  • Autor tematu
  • Support Team

Reputacja: 517
Wszechwiedzący

  • Postów:1 500
  • Lokalizacja:Radom
Offline

Napisano 25.05.2016 21:57

hmmm bytu jako takiego, który by zatrzymał kule to się raczej zrobić nie da, ale możesz spróbować get_user_aim(id), jesli patrząc na ściane zwróci id tejże ściany to w ham_takedamage dajesz get_user_aim(attacker) i jeśli zwróci ściany id to blokujesz obrażenia, bo to znaczy, że w momencie strzału miał celownik na ścianie.

Nie do końca będzie to sprawne, bo między ścianą a graczem może być coś jeszcze, wtedy nie zblokuje obrażeń i jeśli będzie dość mocna broń (awp) to ktoś za ścianą też oberwie.

 

Inna opcja to wykrywanie obrażeń zadanych ścianie, zwrócenie jej hp (aby nie dało się jej zniszczyć), blokada zadawania obrażeń dla attackera na ułamek sekundy(najdłużej do momentu oddania kolejnego strzału). Wtedy obiekt przed ścianą dostanie obrażenia, ale już ten za ścianą będzie miał zblokowane. Oczywiście też w ham_takedamage.


Użytkownik grankee edytował ten post 25.05.2016 21:58

  • +
  • -
  • 1

#9 G[o]Q

    I'm G[o]Q

  • Przyjaciel

Reputacja: 1 344
Godlike

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

Napisano 13.06.2016 16:37

robisz traceline'a jesli gosc strzela w gracza amiedzy nimi jest twoj byt to blokujesz obrazenia i tyle


  • +
  • -
  • 1
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




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

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