Pobranie wysokości na jakiej jest ent
sebuli
30.08.2011
Hej!
Chodzi mi dokładnie o to jak pobrać wysokość danego entu na mapie. Mam starego cod moda i po prostu apteczka leczy na wszystkich wysokościach, a chciałbym żeby leczyła gracza dopiero wtedy kiedy jest na wysokości apteczki. Niestety nie wiem jak pobrać, ani skąd dowiedzieć się na jakiej wysokości jest apteczka. Czy to jakieś origin[2] wyznacza? Bo analizowałem kod i nic nie rozumiem. Jedynie co ustaliłem to, to, że w tej funkcji "new numfound = find_sphere_class(0,"player",totem_dist+0.0,entlist, 32,forigin);" totem_dist jest promieniem, czyli w jakim zakresie ma leczyć dane osoby. I to niestety działa poziomo i pionowo. Dam 10, to uleczy gracza w promieniu 10 od apteczki czy jest na dole czy na górze, zamiast sprawdzać czy gracz jest kolo apteczki... Myślę, że załapaliście o co chodzi. Na pewno wiecie jak to naprawić.
Chodzi mi dokładnie o to jak pobrać wysokość danego entu na mapie. Mam starego cod moda i po prostu apteczka leczy na wszystkich wysokościach, a chciałbym żeby leczyła gracza dopiero wtedy kiedy jest na wysokości apteczki. Niestety nie wiem jak pobrać, ani skąd dowiedzieć się na jakiej wysokości jest apteczka. Czy to jakieś origin[2] wyznacza? Bo analizowałem kod i nic nie rozumiem. Jedynie co ustaliłem to, to, że w tej funkcji "new numfound = find_sphere_class(0,"player",totem_dist+0.0,entlist, 32,forigin);" totem_dist jest promieniem, czyli w jakim zakresie ma leczyć dane osoby. I to niestety działa poziomo i pionowo. Dam 10, to uleczy gracza w promieniu 10 od apteczki czy jest na dole czy na górze, zamiast sprawdzać czy gracz jest kolo apteczki... Myślę, że załapaliście o co chodzi. Na pewno wiecie jak to naprawić.
DarkGL
30.08.2011
new Float:fOrigin[3] pev(entID,pev_origin,fOrigin)w fOrigin[2] masz na jakiej wysokości jest apteczka masz 3 osie
x y z
x - 0
y - 1
z - 2
w cs jest z tego co pamiętam Prawoskrętny układ współrzędnych
sebuli
30.08.2011
new Float:origin[3];
entity_get_vector(id, EV_VEC_origin, origin);
new ent = create_entity("info_target");
entity_set_string(ent, EV_SZ_classname, "Apteczka");
entity_set_edict(ent, EV_ENT_owner, id);
entity_set_int(ent, EV_INT_solid, SOLID_NOT);
entity_set_vector(ent, EV_VEC_origin, origin);
entity_set_float(ent, EV_FL_ltime, halflife_time() + 7 + 0.1);
entity_set_model(ent, "models/w_medkit.mdl");
set_rendering ( ent, kRenderFxGlowShell, 255,0,0, kRenderFxNone, 255 ) ;
drop_to_floor(ent);
entity_set_float(ent, EV_FL_nextthink, halflife_time() + 0.1);
To w takim razie gdzie tutaj jest wysokość apteczki? Możesz wskazać miejsce?
^Grzyboo
30.08.2011
entity_set_vector(ent, EV_VEC_origin, origin);
i wartość jest pod origin[2]
sebuli
30.08.2011
Czyli w tym origin[2] będzie wysokość? Ale ja tak już robiłem, porównywałem wysokość wtedy tego origin[2] z wysokością gracza, który był znaleziony z tego: "new numfound = find_sphere_class(0,"player",totem_dist+0.0,entlist, 32,forigin);", czyli zrobiłem, że jeżeli forigin[2] == origin[2] i nic się nie stało, apteczka mnie nie leczyła chociaż byłem na takiej samej wysokośći.
^Grzyboo
30.08.2011
A nie, nie można określić wysokości raczej, gdyż apteczka madrop_to_floor(ent);więc wysokość sie zmenia zależnie od miejsca i nie możemy tego ustalić o ile się zmienia.
sebuli
30.08.2011
No to chociaż, żeby zablokować wysokość na jakiej leczy apteczka... Bo ona mi leczy kilometr w dół albo w górę, zależy jak promień ustawie totem_dist... Może wypowie się jakiś kozak co ma pojęcie, co jest możliwe a co nie Np. R3X, DarkGL albo ktoś inny.
Edited by sebuli, 30.08.2011 17:38.
Edited by sebuli, 30.08.2011 17:38.
sebuli
30.08.2011
public StworzApteczke(id)
{
if (!ilosc_apteczek_gracza[id])
{
client_print(id, print_center, "Masz tylko 2 apteczki na runde!");
return PLUGIN_CONTINUE;
}
if(inteligencja_gracza[id] < 1)
client_print(id, print_center, "Aby wzmocnic apteczke, zwieksz doswiadczenie bojowe!");
ilosc_apteczek_gracza[id]--;
new Float:origin[3];
entity_get_vector(id, EV_VEC_origin, origin);
new ent = create_entity("info_target");
entity_set_string(ent, EV_SZ_classname, "Apteczka");
entity_set_edict(ent, EV_ENT_owner, id);
entity_set_int(ent, EV_INT_solid, SOLID_NOT);
entity_set_vector(ent, EV_VEC_origin, origin);
entity_set_float(ent, EV_FL_ltime, halflife_time() + 7 + 0.1);
entity_set_model(ent, "models/w_medkit.mdl");
set_rendering ( ent, kRenderFxGlowShell, 255,0,0, kRenderFxNone, 255 ) ;
drop_to_floor(ent);
entity_set_float(ent, EV_FL_nextthink, halflife_time() + 0.1);
return PLUGIN_CONTINUE;
}
public ApteczkaThink(ent)
{
new id = entity_get_edict(ent, EV_ENT_owner);
new totem_dist = 400;
new totem_heal = 5+floatround(inteligencja_gracza[id]*0.1);
if (entity_get_edict(ent, EV_ENT_euser2) == 1)
{
new Float:forigin[3], origin[3];
entity_get_vector(ent, EV_VEC_origin, forigin);
FVecIVec(forigin,origin);
new entlist[33];
new numfound = find_sphere_class(0,"player",totem_dist+0.0,entlist, 32,forigin);
for (new i=0; i < numfound; i++)
{
new pid = entlist[i];
new zdrowie = get_user_health(pid);
new nowe_zdrowie = (zdrowie+totem_heal<maksymalne_zdrowie_gracza[pid])?zdrowie+totem_heal:maksymalne_zdrowie_gracza[pid];
if (get_user_team(pid) != get_user_team(id))
continue;
if (is_user_alive(pid)) set_user_health(pid, nowe_zdrowie);
}
entity_set_edict(ent, EV_ENT_euser2, 0);
entity_set_float(ent, EV_FL_nextthink, halflife_time() + 1.5);
return PLUGIN_CONTINUE;
}
if (entity_get_float(ent, EV_FL_ltime) < halflife_time() || !is_user_alive(id))
{
remove_entity(ent);
return PLUGIN_CONTINUE;
}
if (entity_get_float(ent, EV_FL_ltime)-2.0 < halflife_time())
set_rendering ( ent, kRenderFxNone, 255,255,255, kRenderTransAlpha, 100 ) ;
new Float:forigin[3], origin[3];
entity_get_vector(ent, EV_VEC_origin, forigin);
FVecIVec(forigin,origin);
//Find people near and give them health
message_begin( MSG_BROADCAST, SVC_TEMPENTITY, origin );
write_byte( TE_BEAMCYLINDER );
write_coord( origin[0] );
write_coord( origin[1] );
write_coord( origin[2] );
write_coord( origin[0] );
write_coord( origin[1] + totem_dist );
write_coord( origin[2] + totem_dist );
write_short( sprite_white );
write_byte( 0 ); // startframe
write_byte( 0 ); // framerate
write_byte( 10 ); // life
write_byte( 10 ); // width
write_byte( 255 ); // noise
write_byte( 255 ); // r, g, b
write_byte( 100 );// r, g, b
write_byte( 100 ); // r, g, b
write_byte( 128 ); // brightness
write_byte( 5 ); // speed
message_end();
entity_set_edict(ent, EV_ENT_euser2 ,1);
entity_set_float(ent, EV_FL_nextthink, halflife_time() + 0.5);
return PLUGIN_CONTINUE;
}
Edited by sebuli, 30.08.2011 21:01.
G[o]Q
30.08.2011
if (is_user_alive(pid)) set_user_health(pid, nowe_zdrowie);
zamien na
new forigin[3],aforigin[3]; entity_get_vector(pid, EV_VEC_origin,forigin); entity_get_vector(ent, EV_VEC_origin,aforigin); if (is_user_alive(pid) && forigin[2]==aforigin[2]) set_user_health(pid, nowe_zdrowie);
Edited by G[o]Q, 30.08.2011 23:15.
R3X
31.08.2011
już samo porównywanie floatów operatorem == daje mi powód do wątpliwości czy to działa
Poza tym leżenie w tym samym miejscu apteczki i gracza nie objawia się równymi współrzędnymi Z, a to wynika z poziomu wskazywanego przez Origin (w obu przypadkach środek bytu)
Należy uwzględnić fakt czy gracz stoi czy kuca, przesunąć odpowiednio origin[2] apteczki i wtedy porównać z małym marginesem błędu
Poza tym leżenie w tym samym miejscu apteczki i gracza nie objawia się równymi współrzędnymi Z, a to wynika z poziomu wskazywanego przez Origin (w obu przypadkach środek bytu)
Należy uwzględnić fakt czy gracz stoi czy kuca, przesunąć odpowiednio origin[2] apteczki i wtedy porównać z małym marginesem błędu
if(floatabs(z2 - z1) < 0.1){
sebuli
31.08.2011
Miło Ciebie widzieć R3X na stanowisku administratora Wracając do mojego problemu, to skąd mam pewność co odjąć najpierw? z1 od z2 czy odwrotnie, tak żeby wynik nie wyszedł na minusie, żeby poprawnie działało.
Edit:
Ok poradziłem sobie, Apteczka była zawsze niżej o 36 niż gracz, zawsze Więc to pozwoliło mi w warunku dopisać, że aforigin[2]+36.0 == forigin[2] i działa wyśmienicie. Może jeszcze popracuje nad zakresem tego leczenia żeby nie było takie sztywne (że musi być konieczne równiutkie ). Dzięki za pomoc, szczególnie G[o]Q i za ten wykres R3Xowi Temat można zamknąć.
Edited by sebuli, 31.08.2011 08:33.
Edit:
Ok poradziłem sobie, Apteczka była zawsze niżej o 36 niż gracz, zawsze Więc to pozwoliło mi w warunku dopisać, że aforigin[2]+36.0 == forigin[2] i działa wyśmienicie. Może jeszcze popracuje nad zakresem tego leczenia żeby nie było takie sztywne (że musi być konieczne równiutkie ). Dzięki za pomoc, szczególnie G[o]Q i za ten wykres R3Xowi Temat można zamknąć.
Edited by sebuli, 31.08.2011 08:33.
R3X
31.08.2011
Tam w warunku jest wartość bezwględna i nie ma znaczenia kolejność
floatabs(z2 - z1) == floatabs(z1 - z2)