Pewnego dnia postanowiłem rozwiać wszelkie wątpliwości na temat tworzenia bytów o dowolnych kształtach, ponieważ chciałem w końcu stworzyć coś nowego używając amxxa, niż tylko marne bryły w kształcie sześcianów/prostopadłościanów.
Okazało się to możliwe i to w niemożliwie prosty sposób
SOLID_BSP
No, ale co dalej?
Cała magia polega na tym, że musimy stworzyć "pustą" mapę w VHE, tworząc na środku niej naszą bryłę. Jako jej teksturę ustawiamy CLIP.
Dodajemy dowolne "point entity", np info_null. Kompilujemy mapę, otrzymujemy plik .bsp.
Następnie musimy stworzyć swój własny model, o rozmiarach takich samych jak nasza bryła w pliku .bsp. Jak go stworzyć nie będę tłumaczyć, ponieważ mnie samego wyręczył znajomy.
Posiadając plik .bsp oraz .mdl wystarczy już tylko napisać plugin stawiający nasze dwa byty w jednym miejscu -
- jeden posiadający model x.bsp + SOLID_BSP + MOVETYPE_PUSH (jest to jedyny movetype "wspołpracujący" z solid_bsp);
- drugi posiadający model x.mdl
I to tyle. Pierwszy byt będzie niewidoczny ale będzie odpowiadać za dotyk, drugi natomiast jest modelem zapewniającym "oteksturowanie" tego pierwszego - nie posiadającym dotyku.
Przykład w kodzie:
/* Plugin generated by AMXX-Studio */ #include <amxmodx> #include <amxmisc> #include <engine> #define PLUGIN "New Plug-In" #define VERSION "1.0" #define AUTHOR "author" enum _:Wut{ BSP, MDL }; new g_sWut[Wut][0xE] = { "maps/x.bsp", "models/x.mdl" }; public plugin_init() { register_plugin(PLUGIN, VERSION, AUTHOR) register_concmd("stworz", "_Stworz"); } public plugin_precache() { for(new i ; i < Wut ; i++) precache_model(g_sWut[i]); } public _Stworz(id){ new Float:fOrigin[0x3]; entity_get_vector(id, EV_VEC_origin, fOrigin); fOrigin[0x2]-=36.0; new iEnt = create_entity("func_wall"); entity_set_origin(iEnt, fOrigin); entity_set_int(iEnt, EV_INT_movetype, 0x7); //MOVETYPE_PUSH entity_set_int(iEnt, EV_INT_solid, 0x4); entity_set_model(iEnt, g_sWut[BSP]); new iRendered = create_entity("info_target"); entity_set_origin(iRendered, fOrigin); entity_set_model(iRendered, g_sWut[MDL]); }
Kod ten stworzy byt(y) pod naszymi stopami.
Załączam przykładowy kod wraz z przykładowym modelem oraz plikiem .bsp.