Вопрос такой. Нужно получить индекс игрока который создал энтити.
Можно например вот так:
SetEntPropEnt(ent, Prop_Data, "m_hOwnerEntity", client); записали индекс создателя. (при создании ENT) client = GetEntPropEnt(Ent, Prop_Data, "m_hOwnerEntity"); извлекли индекс создателя.
Но по ряду причин такой вариант не подходит. Какие еще есть варианты получения индекса создателя энтити? Именно через саму энтитю естественно.
SetEntPropEnt(entity, Prop_Send, "m_hOwnerEntity", client);//записали индекс создателя. (при создании ENT) Owner = GetEntProp(entity, Prop_Send, "m_hOwnerEntity");//извлекли индекс создателя.
О боже new iIndexEntity[ 2049 ]; Ent = CreateEntity (Ну типа создал) iIndexEntity[ Ent ] = GetClientUserId( iClient );
Или
new Handle: hTrie = CreateTrie( ); Ent = CreateEntity (Ну типа создал); new iRef = EntIndexToEntRef( Ent ); decl String: sIndex[ 16 ]; FormatEx( sIndex, ( sizeof( sIndex ) - 1 ), "%i", iRef ); SetTrieValue( hTrie, sIndex, GetClientUserId( iClient ) ); Так записали, потом в обратном порядке получение, ну и удалять, когда тебе нужно, все ключи делай через ref, а индексы игроков переводи в userid
Потому что самому создателю этой энтити через модель тогда можно проходить. Нет столкновений.
Если ты используешь флаг "Break on Touch", чтобы сломать энтити, то лучше используй SDKHook_OnStartTouch. С ним прокатывает и такой способ поиска хозяина энтити
В общем выяснилась основная проблема. Поймал ошибку.
Это по поводу плагина Дрон. Значит вроде все нормально, до тех пор пока дрона не сбивают в воздухе и он начинает, как бы, свободное падение. То есть Дрон просто падает по направлению к земле. Я сделал перехват ущерба HookSingleEntityOutput(ent_dron, "OnHealthChanged", EntityOutput:Health_Changed, false);(кстати не пойму как здесь передается создатель т.е. activator)
Пока Дрон находится под управлением т.е. OnPlayerRunCmd определение нанесенного ущерба и кем нанесен этот ущерб работает отлично. Если я теряю управление, Дрон начинает падать, ударяется об землю и разрушается (если HP мало) создатель определяется не иначе как Consol. Со всеми вытекающими косяками. Индекс не определен и пошло - поехало. Что за бред. Не пойму почему консоль. Какое отношение имеет консоль к ущербу.
Создателя (activator) я беру из public Health_Changed(const String:output[], caller, activator, Float:delay){ PrintToChat(killer, "Ты сбил Дрона %N!", activator); (N я определяю полное имя создателя. проверю индекс создателя %i сообщу какой индекс имеет Console)
Если я сам разрушаю Дрона, например из оружия, то пишет (все нормально, правильно) Ты уничтожил своего Дрона!
А когда Дрон падает на землю с высоты и разбивается пишет Ты сбил Дрона Console! Здесь создатель Дрона определен как Consol, хотя создатель этого Дрона я сам, с индексом 1
Получается что я сбил Дрона которого создал не кто иной как Console. Это еще как понять? Кто с таким имел дело - напишите. Интересно а у консоли есть индекс? Со временем напряженка большая.
ЦитатаGodlikE145 ()
Если ты используешь флаг "Break on Touch", чтобы сломать энтити, то лучше используй SDKHook_OnStartTouch. С ним прокатывает и такой способ поиска хозяина энтити
Поломка модели(разрушение) я забил при компиляции модели. Проще говоря она взрывается когда HP=0
так и должно быть, по идее, console = 0, можешь ловить, когда стреляют по дрону, кто последний стрельнул, тот и убийца, а когда хп меняется, если activator = 0, то ставишь убийцу, которого ты нашел ранее
так и должно быть, по идее, console = 0, можешь ловить, когда стреляют по дрону, кто последний стрельнул, тот и убийца, а когда хп меняется, если activator = 0, то ставишь убийцу, которого ты нашел ранее
Да я уже понял. Попробую. Спасибо. Хоть понятнее стало. Не думал что у консоли есть индекс. Хотя как её вызывать не подумал.
Интересно, что будет если созданной энтитьке попробовать присвоить свой индекс.
Сообщение отредактировал tonline_kms65 - Понедельник, 13.06.2016, 08:13:36
http://world-source.ru/forum/102-2521-1 т.е хозяина можно записать m_PredictableID так же в targetname
m_PredictableID очень интересная штука. Индекс выдает правильно. Отличная замена m_hOwnerEntity.
Дело все таки не в определении индекса. Когда Дрон разбивается об землю - всегда одна и та же ошибка:
L 06/15/2016 - 07:46:09: [SM] [0] GetEntProp L 06/15/2016 - 07:46:09: [SM] [1] Line 311, C:\Program Files\Valve\cstrike\addons\sourcemod\scripting\include\entity_prop_stocks.inc::GetEntityFlags()
Пытается получить флаг. В инклюде:
// Note: these are only for use with GetEntityFlags and SetEntityFlags // and may not match the game's actual, internal m_fFlags values. // PLAYER SPECIFIC FLAGS FIRST BECAUSE WE USE ONLY A FEW BITS OF NETWORK PRECISION #define FL_ONGROUND (1 << 0) /**< At rest / on the ground */ #define FL_DUCKING (1 << 1) /**< Player flag -- Player is fully crouched */ #define FL_WATERJUMP (1 << 2) /**< player jumping out of water */ #define FL_ONTRAIN (1 << 3) /**< Player is _controlling_ a train, so movement commands should be ignored on client during prediction. */ #define FL_INRAIN (1 << 4) /**< Indicates the entity is standing in rain */ #define FL_FROZEN (1 << 5) /**< Player is frozen for 3rd person camera */ #define FL_ATCONTROLS (1 << 6) /**< Player can't move, but keeps key inputs for controlling another entity */ #define FL_CLIENT (1 << 7) /**< Is a player */ #define FL_FAKECLIENT (1 << 8) /**< Fake client, simulated server side; don't send network messages to them */ // NOTE if you move things up, make sure to change this value #define PLAYER_FLAG_BITS 9 // NON-PLAYER SPECIFIC (i.e., not used by GameMovement or the client .dll ) -- Can still be applied to players, though #define FL_INWATER (1 << 9) /**< In water */ #define FL_FLY (1 << 10) /**< Changes the SV_Movestep() behavior to not need to be on ground */ #define FL_SWIM (1 << 11) /**< Changes the SV_Movestep() behavior to not need to be on ground (but stay in water) */ #define FL_CONVEYOR (1 << 12) #define FL_NPC (1 << 13) #define FL_GODMODE (1 << 14) #define FL_NOTARGET (1 << 15) #define FL_AIMTARGET (1 << 16) /**< set if the crosshair needs to aim onto the entity */ #define FL_PARTIALGROUND (1 << 17) /**< not all corners are valid */ #define FL_STATICPROP (1 << 18) /**< Eetsa static prop! */ #define FL_GRAPHED (1 << 19) /**< worldgraph has this ent listed as something that blocks a connection */ #define FL_GRENADE (1 << 20) #define FL_STEPMOVEMENT (1 << 21) /**< Changes the SV_Movestep() behavior to not do any processing */ #define FL_DONTTOUCH (1 << 22) /**< Doesn't generate touch functions, generates Untouch() for anything it was touching when this flag was set */ #define FL_BASEVELOCITY (1 << 23) /**< Base velocity has been applied this frame (used to convert base velocity into momentum) */ #define FL_WORLDBRUSH (1 << 24) /**< Not moveable/removeable brush entity (really part of the world, but represented as an entity for transparency or something) */ #define FL_OBJECT (1 << 25) /**< Terrible name. This is an object that NPCs should see. Missiles, for example. */ #define FL_KILLME (1 << 26) /**< This entity is marked for death -- will be freed by game DLL */ #define FL_ONFIRE (1 << 27) /**< You know... */ #define FL_DISSOLVING (1 << 28) /**< We're dissolving! */ #define FL_TRANSRAGDOLL (1 << 29) /**< In the process of turning into a client side ragdoll. */ #define FL_UNBLOCKABLE_BY_PLAYER (1 << 30) /**< pusher that can't be blocked by the player */ #define FL_FREEZING (1 << 31) /**< We're becoming frozen! */ #define FL_EP2V_UNKNOWN1 (1 << 31) /**< Unknown */ // END entity flag #defines
/** * Get an entity's flags. * * @note The game's actual flags are internally translated by SM * to match the entity flags defined above as the actual values * can differ per engine. * * @param entity Entity index. * @return Entity's flags, see entity flag defines above. * @error Invalid entity index, or lack of mod compliance. */ native int GetEntityFlags(int entity);
/** * Sets an entity's flags. * * @note The entity flags as defined above are internally translated by SM * to match the current game's expected value for the flags as * the actual values can differ per engine. * * @param entity Entity index. * @param flags Entity flags, see entity flag defines above. * @error Invalid entity index, or lack of mod compliance. */ native void SetEntityFlags(int entity, int flags);
Добавлено (15.06.2016, 07:17:28) --------------------------------------------- Все. Разобрался. Как обычно все. Сам накосячил. Определение скорости не туда затолкал. Вот и ищет кому бы скорость посчитать.
Спасибо за m_PredictableID. Очень пригодится на будущее.
Тему можно закрыть.
Сообщение отредактировал tonline_kms65 - Среда, 15.06.2016, 07:20:09