public void OnEntityCreated(int entity, const char[] classname)
{
if(StrEqual(classname, "hegrenade_projectile"))
{
RequestFrame(BlockExploding, EntIndexToEntRef(entity));
}
}
public void BlockExploding(int ref)
{
int entity = EntRefToEntIndex(ref);
if (entity != INVALID_ENT_REFERENCE)
{
SetEntProp(entity, Prop_Data, "m_nNextThinkTick", -1);
}
}
Куда это написать?
Сообщения автоматически склеены:
Или это скомпилировать надо?
спасибо, работаетпопробуй:public void OnEntityCreated(int entity, const char[] classname) { if(StrEqual(classname, "hegrenade_projectile")) { RequestFrame(BlockExploding, EntIndexToEntRef(entity)); } } public void BlockExploding(int ref) { int entity = EntRefToEntIndex(ref); if (entity != INVALID_ENT_REFERENCE) { SetEntProp(entity, Prop_Data, "m_nNextThinkTick", -1); } }
и еще, не подскажете плагин что бы были бесконечные гранаты? типа кинул, и сразу появилась новая, без ожидания взрыва
#include <sourcemod>
#include <sdktools>
#include <sdkhooks>
public void OnEntityCreated(int entity, const char[] classname)
{
if (strcmp(classname, "hegrenade_projectile", false) == 0)
{
SDKHook(entity, SDKHook_Spawn, OnEntitySpawned);
}
}
public void OnEntitySpawned(int entity)
{
int owner = GetEntPropEnt(entity, Prop_Data, "m_hOwnerEntity");
if(IsClientInGame(owner) && !IsFakeClient(owner))
{
GivePlayerItem(owner, "weapon_hegrenade");
CreateTimer(0.4, EquipWepaon, GetClientUserId(owner));
}
}
public Action EquipWepaon(Handle timer, int userid)
{
int owner = GetClientOfUserId(userid);
if(owner && IsPlayerAlive(owner)) FakeClientCommandEx(owner, "use weapon_hegrenade");
}
Зачем так думаешь? Код рабочий. SDKHook_Spawn для этого.я не думаю что m_hOwnerEntity вернет вообще что то для этого энтити, будет либо -1 либо ошибки в консоль выводить.
надо получать игрока через m_hThrower.
Таймер здесь не к месту, если Вы используете хуки, то используйте их до конца.простой способ:#include <sourcemod> #include <sdktools> #include <sdkhooks> public void OnEntityCreated(int entity, const char[] classname) { if (strcmp(classname, "hegrenade_projectile", false) == 0) { SDKHook(entity, SDKHook_Spawn, OnEntitySpawned); } } public void OnEntitySpawned(int entity) { int owner = GetEntPropEnt(entity, Prop_Data, "m_hOwnerEntity"); if(IsClientInGame(owner) && !IsFakeClient(owner)) { GivePlayerItem(owner, "weapon_hegrenade"); CreateTimer(0.4, EquipWepaon, GetClientUserId(owner)); } } public Action EquipWepaon(Handle timer, int userid) { int owner = GetClientOfUserId(userid); if(owner && IsPlayerAlive(owner)) FakeClientCommandEx(owner, "use weapon_hegrenade"); }
я вообще не обратил внимание как там реализовал ты.Зачем так думаешь? Код рабочий. SDKHook_Spawn для этого.
Таймер здесь не к месту, если Вы используете хуки, то используйте их до конца.
#include <sourcemod>
#include <sdktools>
#include <sdkhooks>
public void OnEntityCreated(int entity, const char[] classname)
{
if (strcmp(classname, "hegrenade_projectile", false) == 0)
{
SDKHook(entity, SDKHook_Spawn, OnEntitySpawned);
}
}
public void OnEntitySpawned(int entity)
{
int owner = GetEntPropEnt(entity, Prop_Data, "m_hOwnerEntity");
if(owner > 0 && IsClientInGame(owner) && !IsFakeClient(owner) && IsPlayerAlive(owner))
{
int weapon = GivePlayerItem(owner, "weapon_hegrenade");
FakeClientCommandEx(owner, "use weapon_hegrenade");
SetEntPropEnt(owner, Prop_Send, "m_hActiveWeapon", weapon);
}
}
Если создаётся hegrenade_projectile, то это не всегда значит, что игрок кинул грену =)Код рабочий. SDKHook_Spawn для этого.
new ent = CreateEntityByName("hegrenade_projectile");
DispatchSpawn(ent); // m_hOwnerEntity = -1, IsClientInGame(-1) = [SM] Exception reported: Client index -1 is invalid
Не всегда в момент спавна можно получить все параметры энтити, т.к. они на тот момент могут быть ещё не присвоены.Таймер здесь не к месту, если Вы используете хуки, то используйте их до конца.
Речь про наличие таймера в обход логического использования функционала sdk, который используется и имеет в наличии необходимые инструменты.Не всегда в момент спавна можно получить все параметры энтити, т.к. они на тот момент могут быть ещё не присвоены.
А вот через тик после создания, как правило, все параметры уже в порядке.
owner > 0Если создаётся hegrenade_projectile, то это не всегда значит, что игрок кинул грену =)
Entity могли создать для каких-то своих целей, не указав владельца.