Bomb Hound Eye - Bomb Marker
Najlepsza odpowiedź psilocybe 04.12.2014 17:51
@up,
Racja, tak by było Tyle ile na serwerze graczy razy niewiadomo ile Thinków = crash serwera
Teraz jest po prostu task z flagą "b", uruchamia go drop bomby a usuwa pickup i działa jak należy
Już ogarnąłem to co chciałem na ten moment. Dzięki za pomoc.
Plugin wrzucę na listę, jak by ktoś potrzebował
CLOSE.
Przejdź do postu
psilocybe
04.12.2014
Witam, zachciało mi się napisać plugin który będzie pomagał w odnalezieniu leżącej paki.
Pomyslałem że to będzie proste. Bynajmniej
Użyłem eventu BombDrop oraz efektu Hound Eye z HL (TE_BEAMCYLINDER)
Problem w tym że w evencie BombDrop pierwsze trzy argumenty to nie jak myślałem origin paki, lecz origin gracza w momencie dropnięcia paki.
No i puszcza mi sprite'a z miejsca gdzie stałem podczas dropu zamiast od środeczka paki
1. Jak pobrać origin leżącej na ziemi paki?
2. Jak zapętlić "puszczanie" BEAMCYLINDER np. co 3 sekundy, dopóki paka nie zostanie podniesiona (BombPickup)
Prosił bym o przykłady jak pobrać origin entów (leżąca paka jest entem?) oraz przykłady Tasków, jak to ugryźć? Bo chyba taskiem będziemy "puszczać" efekt?
Z góry dzięki za pomoc, liczę na Was
#include <amxmodx> new gSprBeam public plugin_init() { register_plugin("Houndeye Bomb", "0.1", "psilocybe") register_event("BombDrop", "bomb_drop", "b", "4=0") } public plugin_precache() { gSprBeam = precache_model("sprites/white.spr") } public bomb_drop() { client_print(0, print_chat, "X: %d, Y: %d, Z: %d", read_data(1), read_data(2), read_data(3)); // sprawdzalem czy pobiera wpolrzedne message_begin( MSG_BROADCAST, SVC_TEMPENTITY, {0,0,0} ); write_byte( TE_BEAMCYLINDER ); write_coord( read_data(1) ); write_coord( read_data(2) ); write_coord( read_data(3) ); write_coord( read_data(1) ); write_coord( read_data(2) + 5 ); write_coord( read_data(3) + 150 ); write_short( gSprBeam ); write_byte( 0 ); // startframe write_byte( 0 ); // framerate write_byte( 200 ); // life write_byte( 10 ); // width write_byte( 255 ); // noise write_byte( 255 ); // r, g, b write_byte( 10 ); // r, g, b write_byte( 10 ); // r, g, b write_byte( 180 ); // brightness write_byte( 2 ); // speed message_end(); }
Ps. Gdyby ktoś był w stanie wyciągnąć efekt HoundEye z HL to było by za***iście, chodzi o to że pieski puszczały kilka kółeczek gdy szczekały i na pewno nie było tasków
Wykład nt. HoundEye'ów:
^Szeregowy^ 04.12.2014
Orgin Podlozonej
public bomb_planted( planter )
{
new Float:origin[3];
get_user_origin(planter, origin)
}
lub z fakemeta:
public bomb_planted( planter )
{
new Float:origin[3];
pev(planter, pev_origin, origin)
}Orgin Lezacejnew c4 = -1while((c4 = find_ent_by_model(c4, "grenade", "sciezka_do_modelu_paki")))
{
new Float:origin[3];
get_user_origin(c4, origin)
}
Bądź w fakemecie
[sma]
new c4 = -1
while((c4 = find_ent_by_model(c4, "grenade", "sciezka_do_modelu_paki")))
{
new Float:origin[3];
pev(c4, pev_origin, origin)
}
Co do samego śledzenia, jest to dosyć proste do zrealizowania. Na początku rundy śledzisz do kogo trafia paka:register_event("WeapPickup", "event_got_bomb", "be", "1=6")Event ładnie zwraca id gracza, który dostaje bombę. Później przelatujesz po jego "inventory" i dopadasz bombę. Gdy ją znajdziesz, zapisujesz id enta do zmiennej globalnej i później przez cały czas pobierasz pozycję tego enta.
A tu masz rozwiązanie prostrze i znajdujące wszystkie niepodłożone bomby na mapie:
[sma]
new ent=-1, Float:origin[3];
while((ent = find_ent_by_class(ent, "weapon_c4"))){
pev(ent, pev_origin, origin);
}
ent=-1;
while((ent = find_ent_by_model(ent, "weaponbox", "models/w_backpack.mdl"))){
pev(ent, pev_origin, origin);
}
Użytkownik ^Szeregowy^ edytował ten post 04.12.2014 12:40
psilocybe
04.12.2014
Wkleiłeś jakiś wyrwany z pluginu kod, poświęcił byś choć minute i edytował mój kod, pokazał w jakim evencie i kiedy mam pobrać origin tego enta.
Nie mam pojęcia jak się teraz za to zabrać.
^Szeregowy^ 04.12.2014
To sa funkcje z pluginu
Użytkownik ^Szeregowy^ edytował ten post 04.12.2014 13:54
^Szeregowy^ 04.12.2014
#include <amxmodx>
#include <amxmisc>
#include <fakemeta>
#define PLUGIN "New Plug-In"
#define VERSION "1.0"
#define AUTHOR "NIE ZNANY"
#define DROP 87123
new id_paki;
public plugin_init() {
register_plugin(PLUGIN, VERSION, AUTHOR)
register_logevent("logSpawBomb", 3, "2=Spawned_With_The_Bomb");
register_logevent("logSpawBomb", 3, "2=Got_The_Bomb");
register_logevent("logDropBomb", 3, "2=Dropped_The_Bomb");
register_logevent("logPlantBomb", 3, "2=Planted_The_Bomb");
register_forward(FM_PlayerPostThink, "fwPlayerPostThink");
}
public logSpawBomb()
{
remove_task(DROP);
id_paki = engfunc(EngFunc_FindEntityByString, -1, "classname", "weapon_c4");
}
public logDropBomb()
{
set_task(0.1, "taskDrop", DROP);
}
public taskDrop()
{
id_paki = fm_find_ent_by_model(-1, "weaponbox", "models/w_backpack.mdl");
}
public logPlantBomb()
{
id_paki = 0;
}
public fwPlayerPostThink(id)
{
if(!is_user_alive(id))
return;
if(!pev_valid(id_paki))
return;
new Float:PakaOrigin[3];
pev(id_paki, pev_origin, PakaOrigin);
//tu dalej kod na wyświetalnie tego co chcesz ...
}
stock fm_find_ent_by_model(index, const classname[], const models[])
{
new ent = index, model[32];
while((ent = engfunc(EngFunc_FindEntityByString, ent, "classname", classname)))
{
pev(ent, pev_model, model, 31);
if(equal(model, models))
return ent;
}
return 0;
}
Użytkownik ^Szeregowy^ edytował ten post 04.12.2014 13:57
psilocybe
04.12.2014
Dobra kolego, pomogłeś tym postem
Jestem już blisko
Aktualnie kod wygląda tak:
#include <amxmodx> #include <amxmisc> #include <fakemeta> new gSprBeam, id_paki public plugin_init() { register_plugin("Houndeye Bomb", "0.1", "psilocybe"); register_logevent("logDropBomb", 3, "2=Dropped_The_Bomb"); register_forward(FM_PlayerPostThink, "fwPlayerPostThink"); } public plugin_precache() { gSprBeam = precache_model("sprites/white.spr") } public logDropBomb() { set_task(3.0, "taskDrop"); } public taskDrop() { id_paki = fm_find_ent_by_model(-1, "weaponbox", "models/w_backpack.mdl"); } public fwPlayerPostThink(id) { if(!is_user_alive(id)) return; if(!pev_valid(id_paki)) return; new Float:forigin[3], origin[3] pev(id_paki,pev_origin,forigin) FVecIVec(forigin,origin) client_print(0, print_chat, "X: %d, Y: %d, Z: %d", origin[0], origin[1], origin[2]); message_begin( MSG_BROADCAST, SVC_TEMPENTITY, {0,0,0} ); write_byte( TE_BEAMCYLINDER ); write_coord( origin[0] ); write_coord( origin[1] ); write_coord( origin[2] ); write_coord( origin[0] ); write_coord( origin[1] + 5 ); write_coord( origin[2] + 150 ); write_short( gSprBeam ); write_byte( 0 ); // startframe write_byte( 0 ); // framerate write_byte( 200 ); // life write_byte( 10 ); // width write_byte( 255 ); // noise write_byte( 255 ); // r, g, b write_byte( 10 ); // r, g, b write_byte( 10 ); // r, g, b write_byte( 180 ); // brightness write_byte( 2 ); // speed message_end(); } stock fm_find_ent_by_model(index, const classname[], const models[]) { new ent = index, model[32]; while((ent = engfunc(EngFunc_FindEntityByString, ent, "classname", classname))) { pev(ent, pev_model, model, 31); if(equal(model, models)) return ent; } return 0; }
No i przez PostThink chyba nie mogę wysyłać tego BEAM'a bo dzieje się coś takiego:
Tak co kilka sekund wywala setki BEAMów
Ja chcę puszczać jeden BEAM co 3 sekundy Jak to zrobić teraz?
psilocybe
04.12.2014
Spoko że mogę edytować
Wyrzuciłem PostThink, dałem task podczas dropu i puszcza ładnie Beam'a po 3.3s od dropnięcia paki ale tylko raz
Pytanie: Jak zapętlić set_task(3.0, "beamTask"); a później usunąć w evencie BombPickup? Nie ogarniam tasków Mogę to zrobić "na pałę" ale nie o to chodzi
Aktualnie działający plugin:
#include <amxmodx> #include <amxmisc> #include <fakemeta> new gSprBeam, id_paki public plugin_init() { register_plugin("Houndeye Bomb", "0.1", "psilocybe"); register_logevent("logDropBomb", 3, "2=Dropped_The_Bomb"); } public plugin_precache() { gSprBeam = precache_model("sprites/white.spr") } public logDropBomb() { set_task(0.3, "taskDrop"); } public taskDrop() { id_paki = fm_find_ent_by_model(-1, "weaponbox", "models/w_backpack.mdl"); set_task(3.0, "beamTask"); } public beamTask() { if(!pev_valid(id_paki)) return; new Float:forigin[3], origin[3] pev(id_paki,pev_origin,forigin) FVecIVec(forigin,origin) client_print(0, print_chat, "X: %d, Y: %d, Z: %d", origin[0], origin[1], origin[2]); message_begin( MSG_BROADCAST, SVC_TEMPENTITY, {0,0,0} ); write_byte( TE_BEAMCYLINDER ); write_coord( origin[0] ); write_coord( origin[1] ); write_coord( origin[2] ); write_coord( origin[0] ); write_coord( origin[1] + 5 ); write_coord( origin[2] + 150 ); write_short( gSprBeam ); write_byte( 0 ); // startframe write_byte( 0 ); // framerate write_byte( 200 ); // life write_byte( 10 ); // width write_byte( 255 ); // noise write_byte( 255 ); // r, g, b write_byte( 10 ); // r, g, b write_byte( 10 ); // r, g, b write_byte( 180 ); // brightness write_byte( 2 ); // speed message_end(); } stock fm_find_ent_by_model(index, const classname[], const models[]) { new ent = index, model[32]; while((ent = engfunc(EngFunc_FindEntityByString, ent, "classname", classname))) { pev(ent, pev_model, model, 31); if(equal(model, models)) return ent; } return 0; }
^Szeregowy^ 04.12.2014
w
public nazwa(id)
{
id-=291 << id wymysl
)
i potem tam gdzie wylaczasz
if(task_exists(id+291))remove_task(id+291);
Użytkownik ^Szeregowy^ edytował ten post 04.12.2014 15:46
wiwi249
04.12.2014
po prostu odsyłaj się do beamTask z jakimś id, jak napisane jest wyżej.
Zróbmy jakieś id dla tego tasku, np. 98765.
set_task(3.0, "beamTask", 98765)
Tą linijkę sobie wrzuć zarówno tam, gdzie masz taskDrop i na końcu funkcji beamTask tak samo, wtedy się zapętli.
Następnie w evencie podniesienia bomby, po prostu sprawdzasz czy istnieje task o takim id i jeśli tak, to go usuwasz.
if(task_exists(98765)) remove_task(98765)
psilocybe
04.12.2014
Za dużo palę chyba
Rzuciłem okiem na to:
http://amxx.pl/topic...unkcje-czasowe/
No i napisałem podobnie jak wyżej Zapętliłem taska, dodałem event BombPickup i w nim remove_task
Plugin działa jak chciałem, pozostało dopracować Beam'a i będzie super
Dopracuję to wrzucę na listę pluginów, bo szukałem podobnej wtyczki i nie znalazłem
Dzięki za pomoc. Proszę jeszcze nie zamykać
wiwi249
04.12.2014
Noo, osobiście uważam trochę bez sensu robić takie efekty, które są dla wszystkich, na bazie postThinka, bo to jest funkcja dotycząca jednego gracza, a masz wyraźnie wypisane przy robieniu HoundEye, że ma to być MSG_BROADCAST, czyli ma być widoczna dla wszystkich graczy. W sumie to to chyba by się wykonywało przy każdym thinku każdego gracza, czyli HoundEye'ów robiłoby się tyle, ile jest na serwerze graczy. Musiałbym sprawdzić.
Najlepsza odpowiedź
psilocybe
04.12.2014
@up,
Racja, tak by było Tyle ile na serwerze graczy razy niewiadomo ile Thinków = crash serwera
Teraz jest po prostu task z flagą "b", uruchamia go drop bomby a usuwa pickup i działa jak należy
Już ogarnąłem to co chciałem na ten moment. Dzięki za pomoc.
Plugin wrzucę na listę, jak by ktoś potrzebował
CLOSE.