PDA

Просмотр полной версии : [Вопрос] Массивы



tonline_kms65
20.09.2016, 09:57
Всем здравствуйте.
У меня вопрос. Понимаю что не в тему. Но язык в принципе такой же.

Я пишу плагин "Drone". Плагин для Counter-Strike:Source.


https://www.youtube.com/watch?v=PlYYzsSLTHI

Суть плагина - любой игрок, из любой команды может создавать Дронов, и так же может брать созданных кем-то Дронов (которые валяются безхозные). Можно удаленно вызвать Дрона, если он не занят кем -то.

Теперь к сути проблемы:
Задаю переменные таким образом:


#define MAX_ENT 128
enum eDrone
{
bool:DroneUsed=false, //0 (Этот элемент и так 0. ложь я ему задаю на всякий случай)
DroneID, // 1
DroneCamID, // 2
DroneGlowSpriteID, // 3
};

new FreeDron[MAX_ENT+1][eDrone]; // свободный Дрон
new ClientDron[MAXPLAYERS+1][eDrone]; // это Дрон занятый
new count; // общее кол-во Дронов на сервере


Проблема возникает после разрушения какого нибудь из Дронов.
При count = 3;
После разрушения 1 Дрона не видно 3 Дрон. Второй Дрон видно.
После разрушения 2 Дрона не видно 3 Дрон. Первый Дрон видно.
После разрушения 3 Дрона Первый и Второй Дроны видно.

Тоже самое и при count = 5 и т.д.
Во всех случаях, после разрушения, последний Дрон не виден(недоступен). Ну и естественно при разрушении последнего Дрона все оставшиеся Дроны отлично видно.
Т.е. получается что сам массив как бы сдвигается что ли, до нулевого (после последнего). Или наоборот, не сдвигается.
(Не виден это не визуально, не видно в плане его доступности.)
Дрон просто не определяется по его ID.
И соответственно попытка вызвать или взять Дрона не получается. В общем проблема такого плана. Может быть здесь кто нибудь с таким сталкивался.

Еще раз прошу прощения за то что мой плагин не для SA:MP. Повторюсь - язык точно такой же.

DeimoS
20.09.2016, 13:19
Во-первых, вопрос всё же не по SA-MP, поэтому перенёс тему в более подходящий раздел.
Во-вторых, нужно смотреть код разрушения, а не объявление массивов

tonline_kms65
20.09.2016, 14:08
HookSingleEntityOutput(ent_dron, "OnHealthChanged", Drone_Hurt, false); // Функция при изменении HP Дрона
HookSingleEntityOutput(ent_dron, "OnBreak", Drone_Break, false); // Функция при разрушении Дрона




public Drone_Break(const String:output[], caller, activator, Float:delay){
if(!IsValidEntity(caller)) return;
AcceptEntityInput(caller, "KillHierarchy");
AcceptEntityInput(caller, "Kill");
--count;
}




public Drone_Hurt(const String:output[], caller, activator, Float:delay){
if(!IsValidEntity(caller)) return;

int healch = GetEntProp(caller, Prop_Data, "m_iHealth");
int killer = GetEntPropEnt(caller, Prop_Data, "m_hLastAttacker");
int client = GetEntPropEnt(caller, Prop_Send, "m_PredictableID");
int ID_anim = GetIndexAnimID(caller);

if(client > 0 && client <= MaxClients){
if(IsClientInGame(client)){

if (healch <= 50){ // При HP меньше или = 50 поджигаем и меняем скин модели на горелый
IgniteEntity(caller, 2.0 );
if (ID_anim !=0){
DispatchKeyValue(ID_anim, "skin", "2"); // устанавливаем модели горелый вид
}
}

if (healch <= 0){
if (camera[client] == true){
SetEntProp ( client, Prop_Send, "m_iObserverMode" , 0 ); // норм вид
SetEntProp ( client, Prop_Send, "m_iFOV" , 90 );
SetClientViewEntity(client, client);
SetEntityRenderMode(client, RENDER_TRANSCOLOR);
SetEntityRenderColor(client, 255, 255, 255, 255);
SetEntityMoveType(client, MOVETYPE_ISOMETRIC); // MOVETYPE_WALK
SetClientOverlay(client, "");
camera[client] = false;
}


if (TimerSpeedDrone[client] != INVALID_HANDLE){ // таймер убиваем
KillTimer(TimerSpeedDrone[client], false);
TimerSpeedDrone[client] = INVALID_HANDLE;
}
StopSound(caller, SNDCHAN_AUTO, DRON_FLY1_SOUND);

if (killer != -1){ // если Дрон разрушен как то по другому.
if (killer != client){
PrintCenterText(killer, "Ты сбил Дрона %N! %i", client, client);
PrintToChat (killer, "Ты сбил Дрона %N! %i", client, client);
PrintCenterText(client, "Твоего Дрона сбил %N!", killer);
PrintToChat (client, "Твоего Дрона сбил %N!", killer);

} else if (killer == client){
PrintCenterText(client, "Ты уничтожил своего Дрона!");
PrintToChat(client, "Ты уничтожил своего Дрона!");
}
} else {
PrintCenterText(client, "Твой Дрон разрушен!");
PrintToChat (client, "Твой Дрон разрушен!");
}

EmitSoundToAll(
DRONE_DEBRIS_SOUND,
caller,
SNDCHAN_AUTO,
SNDLEVEL_NORMAL,
SND_NOFLAGS,
SNDVOL_NORMAL,
125,
-1,
NULL_VECTOR,
NULL_VECTOR,
true,
0.0);


}
}
}
}


Мне предлагают сделать массивы динамическими. Но я сомневаюсь что это поможет.
Спасибо за ответ.

ziggi
20.09.2016, 14:24
Покажи где и как ты работаешь с теми массивами из 1 поста. Также нужен код вызова, взятия дронов, не помешает код создания. В общем, нужен весь код, связанный с дронами.

tonline_kms65
20.09.2016, 14:51
Покажи где и как ты работаешь с теми массивами из 1 поста. Также нужен код вызова, взятия дронов, не помешает код создания. В общем, нужен весь код, связанный с дронами.

Работа с ними везде. Начиная от создания ENT до момента его разрушения.

Создаю ENT, называю Дрон.
В массив FreeDron записываю данные из этой ENT.
FreeDron[][] это массив для свободной(не занятой клиентом) ENT (Дрона).

ClientDron[][] этот массив для ENT занятой клиентом. В этот массив записываю данные из созданной ENT Дрона при активации клиентом (проще - если клиент начал использовать Дрона)

Весь код к сожалению показать не могу. Его отсюда утащат, переделают, и будут продавать как свой. Обычная история. Желающих, как не странно, много.
Уже декомпилить тестовый плагин пытались.

ziggi
20.09.2016, 15:26
Работа с ними везде. Начиная от создания ENT до момента его разрушения.

Создаю ENT, называю Дрон.
В массив FreeDron записываю данные из этой ENT.
FreeDron[][] это массив для свободной(не занятой клиентом) ENT (Дрона).

ClientDron[][] этот массив для ENT занятой клиентом. В этот массив записываю данные из созданной ENT Дрона при активации клиентом (проще - если клиент начал использовать Дрона)

Весь код к сожалению показать не могу. Его отсюда утащат, переделают, и будут продавать как свой. Обычная история. Желающих, как не странно, много.
Уже декомпилить тестовый плагин пытались.

Где-то есть ошибка, а чтобы решить проблему тебе нужно её исправить. Это всё, чем тебе можно помочь с тем количеством информации, которое ты предоставил.