#include <amxmodx>
#include <engine>
#include <fakemeta>
new bool:gBreakable[500]//w razie wiekszej ilosci bytow na mapie-zwiekszyc(nie sadze zeby bylo to konieczne)
public plugin_init() {
register_plugin("Napraw kratke", "0.1", "grankee")
register_forward(FM_EmitSound,"emitsound",1)
register_event("HLTV", "Nowa_Runda", "a", "1=0", "2=0")
register_clcmd("say /byt","RespawnujByt")
}
public RespawnujByt(id){
//Kod który przywróci na swoje miejsce zniszczony
//byt func_breakable znajdujący się najbliżej gracza id
if(!is_user_alive(id)) return PLUGIN_CONTINUE
new Float:or[3]
pev(id,pev_origin,or)
new Float:absmin[3],Float:absmax[3],ent,najblizszy_ent,Float:najkrotszy_dystans
while((ent=find_ent_by_class(ent,"func_breakable"))!=0)
{
if(!gBreakable[ent]) continue//jesli ent nie jest rozwalony to go pomijamy
pev(ent,pev_absmin,absmin)
pev(ent,pev_absmax,absmax)
wartosc_srodkowa(absmin,absmax,absmin)//ustala origin na podstawie absmin i absmax a nazstepnie zapisuje go do absmin, zeby nie tworzyc kolejnej zmiennej
new Float:dystans
dystans=get_distance_f(or,absmin)
//odkomentuj sobie linijkę pod spodem jesli chcesz, zeby nie znajdowało dalej niż 300 unitów
//zeby ktos np z drugiego konca mapy nie mogl wstawic kratki, oczywiscie 300.0 zmien sobie na inna jak chcesz
//if(dystans>300.0) continue
if(dystans<najkrotszy_dystans || najkrotszy_dystans==0.0)
{
najkrotszy_dystans=dystans
najblizszy_ent=ent
}
}
if(!najblizszy_ent)
{
client_print(id,print_chat,"Brak celu do naprawienia")
return PLUGIN_CONTINUE
}
set_pev(najblizszy_ent,pev_solid,4)
set_pev(najblizszy_ent,pev_takedamage,1.0)
set_pev(najblizszy_ent,pev_health,20.0)
set_pev(najblizszy_ent,pev_deadflag,0)
set_pev(najblizszy_ent,pev_effects,0)
client_print(id,print_chat,"Naprawiono")
gBreakable[najblizszy_ent]=false
return PLUGIN_CONTINUE
}
public Nowa_Runda()
{
for(new a=33;a<sizeof gBreakable;a++)
gBreakable[a]=false
}
public emitsound(ent)
{
new classname[32]
pev(ent,pev_classname,classname,31)
if(equali(classname,"func_breakable"))
{
set_task(0.1,"breakable_killed",ent)
}
return FMRES_IGNORED
}
public breakable_killed(ent)
{
if(pev(ent,pev_solid)==0)
{
gBreakable[ent]=true
client_print(0,print_chat,"%d killed",ent)
}
return 0
}
wartosc_srodkowa(const Float:liczba1[3],const Float:liczba2[3],Float:wynik[3])
{
new Float:roznica
for(new a=0;a<3;a++)
{
roznica=liczba1[a]-liczba2[a]
if(roznica==0)
{
wynik[a]=0.0
continue
}
wynik[a]=(roznica>0)?(liczba1[a]-(roznica/2)):(liczba2[a]-(floatabs(roznica)/2))
}
}
Użytkownik grankee edytował ten post 17.12.2014 14:27