| 
 
 
	
		
		
			| Спасайте, застряла на половине пути. |  |  |  | 
| Karandachik | Дата: Четверг, 30.11.2017, 17:53:13 | Сообщение # 1 |  |   
|  |  | Сообщений: 60 Репутация: 3 [ +/- ]
 |  | Привет мальчики. Всех с наступающим новым годом!   Желаю в новом году всем любви и счастья.
 Пусть в новом году у всех сбудутся все мечты, пусть каждый найдет свою половинку.
 
 Хочу написать плагин для surf сервера.
 Идея такая - игрокам с флагом "A" будет доступна команда !board.
 После ввода команды в чате игроку будет выдаваться сноуборд, который прилепиться к ногам игрока и будет у него определенное время.
 Хочу так же добавить скорость и эффекты.
 Карту мне сделают, модель сделают, а вот с кодом решила попробовать сама.
 Поискала на форуме много примеров кода с моделями и нашла подходящее.
 Слепила, получилось вроде как неплохо, но есть проблемы.
 Может кто-то сможет мне подсказать или скинуть готовые варианты плагинов, откуда можно подсмотреть реализацию.
 
 Мой код выдачи модельки, пока взяла тестовую модель.
 
 
 Код FuncBoard(client)
 {
 new Float:vec[3];
 GetClientAbsOrigin(client, vec); // координаты игрока
 decl String:xName[10];
 IntToString(client, xName, 10);
 DispatchKeyValue(client, "targetname", xName); // формировка имени игрока для присоединения  к модели
 
 new index = CreateEntityByName("prop_dynamic"); //  код модельки
 if (index > 0)
 {
 DispatchKeyValue(index, "model", "models/props/de_inferno/fountain.mdl"); //взяла для теста
 DispatchKeyValue(index, "DefaultAnim", "test");
 DispatchKeyValue(index, "solid", "0");
 DispatchKeyValue(index, "spawnflags", "3");
 DispatchSpawn(index);
 vec[2] += 25.0; // возможность редактировать координаты выше - ниже
 TeleportEntity(index, vec, NULL_VECTOR, NULL_VECTOR); // спауним
 SetVariantString(xName);
 AcceptEntityInput(index, "SetParent"); // привязываем к игроку по таргетнейму
 RemoveBoard[client] = CreateTimer(10.0, KillBoard, client); // хотела сделать запуск таймера на удаление модели
 }
 }
 
 Модель появляется и сидит на игроке как я и хотела, но вот если игрок умер или реконектнулся на сервер, моделька не пропадает висит и летает за ним в спектраторе.
 
 - как мне удалять модель по прошествии определенного времени, как сделать это время с настройкой?
 - как удалить модель после смерти игрока или после его выхода с сервера?
 - как если удаляю таймером модель, удалить сам таймер если игрок умер?
 
 Прошу вас помогите мне понять как это все сделать.
 C++ - не сильна, могу сказать что для меня это все очень сложная вещь.
 Не ругайтесь, пробую написать сама, хочу научиться.
 
 
 Сообщение отредактировал Karandachik - Четверг, 30.11.2017, 17:53:53 |  |  |  |  |  | 
| Nail | Дата: Четверг, 30.11.2017, 19:11:28 | Сообщение # 2 |  |   
|  |  | Сообщений: 38 Репутация: 8 [ +/- ]
 |  | 1) Таймеры или геймфрэйм (гемфрейм будет накладнее)2) https://sm.alliedmods.net/new-api/clients/OnClientDisconnect - вызывается когда игрок собирается покинуть сервер (т.е. объект CBasePlayer еще валидный)
 https://sm.alliedmods.net/new-api/events/HookEvent через эту функцию хукаются события смерти, переходы в спектры и т.п.
 https://wiki.alliedmods.net/Game_Events_(Source) Тут список доступных ивентов.
 Если нужно хукнуть ивент до его совершения - надо поставить EventHookMode в значение EventHookMode_Pre
 3) https://sm.alliedmods.net/new-api/timers/KillTimer
 или
 https://sm.alliedmods.net/new-api/handles/CloseHandle
 Указатель на таймер (в нашем случае это хэндл) остается валидным после уничтожения таймера и если он хранится глобально, то его следует руками занулять.
 
 И это всёж не C++, ближе к чистому С98 но и до него очень далеко. С другой стороны, с последними обновлениями были добавлены объекты и утилизирован костыль enum для структур данных, что отдаляет язык от C98 и приближает к C++. Лучше его называть SourcePawn.
 Советую переходить на Transitional Syntax, он ближе как к C++ так и к C. Старый API объявлен устаревшим и лет через 5-10 он может быть выведен из оборота.
 
 В вашем коде (возможно) отсутствует вызов кеширования модели, в некоторых случаях это будет приводить к крашу сервера с сигфолтом
 https://sm.alliedmods.net/new-api/halflife/PrecacheModel
 
 
 Сообщение отредактировал Nail - Четверг, 30.11.2017, 19:27:43 |  |  |  |  |  | 
| WOW_NAMES | Дата: Четверг, 30.11.2017, 20:06:54 | Сообщение # 3 |  |   
|  |  | Сообщений: 170 Репутация: -1 [ +/- ]
 |  | Nail, Спорим, что отсылка на new-api не поможет ей! Девушка просит же кусок кода что бы увидеть и понять смысл (логику).
 Исходя из прочитанного я понял, что тут необходимо написать код или дать похожий а уже поняв его она сама сможет дальше делать свой плагин.
 
   Даже не знаю что можно предложить ей, может что-нибудь из props мода или из плагинов с моделью с4 =).
 |  |  |  |  |  | 
| _R1KO_ | Дата: Четверг, 30.11.2017, 23:23:55 | Сообщение # 4 |  |   
|  |  | Сообщений: 200 Репутация: 30 [ +/- ]
 |  | Цитата Karandachik (  )  Модель появляется и сидит на игроке как я и хотела, но вот если игрок умер или реконектнулся на сервер, моделька не пропадает висит и летает за ним в спектраторе.Ловить смерть игрока (player_death) и убивать ентити модели. Не забудь сохранять в глобальный массив индекс ентити сноуборда каждого игрока,
 
 
 Цитата Karandachik (  )  - как мне удалять модель по прошествии определенного времени, как сделать это время с настройкой?
 Код FormatEx(sBuffer, sizeof(sBuffer), "OnUser1 !self:kill::%0.2f:-1", 15.0); // 15.0 - время жизни ентитиSetVariantString(sBuffer);
 AcceptEntityInput(iEntity, "AddOutput");
 AcceptEntityInput(iEntity, "FireUser1");
 
 Цитата WOW_NAMES (  )  Спорим, что отсылка на new-api не поможет ей! как и тебе, любитель получать готовый код.
 |  |  |  |  |  | 
| Karandachik | Дата: Пятница, 01.12.2017, 09:25:16 | Сообщение # 5 |  |   
|  |  | Сообщений: 60 Репутация: 3 [ +/- ]
 |  | О боже я думала проще будет все.Мне не понять даже то, что вы написали, а про то как это самой сделать и говорить не приходиться.
   Н-да уж.........
 
 Может кто то поможет мне и напишет плагин?
 Заплачу в пределах разумного.
 PS Хочется бесплатно конечно, если можно конечно.
   
 Добавлено (01.12.2017, 09:24:18)---------------------------------------------
 
 Цитата Karandachik (  )  Ловить смерть игрока (player_death) и убивать ентити модели. Не забудь сохранять в глобальный массив индекс ентити сноуборда каждого игрока,
 Ну вот это я поняла:
 
 Код public OnPluginStart(){
 HookEvent("player_death", PlayerDeath, EventHookMode_Pre);
 
 а потом
 
 public PlayerDeath(Handle:event, const String:name[], bool:dontBroadcast)
 {
 тут что писать?
 }
 
 А вот это что? "в глобальный массив индекс ентити сноуборда"
 }
Добавлено (01.12.2017, 09:25:16)---------------------------------------------
 Кароче я поняла - я тупая, все капец.
 |  |  |  |  |  | 
| WOW_NAMES | Дата: Пятница, 01.12.2017, 10:13:20 | Сообщение # 6 |  |   
|  |  | Сообщений: 170 Репутация: -1 [ +/- ]
 |  | Цитата _R1KO_ (  )  как и тебе, любитель получать готовый код.Та завидуй молча уже!
 Karandachik, Напиши сразу владельцу форума, че мучаешься то?
 
 |  |  |  |  |  | 
| Entity | Дата: Пятница, 01.12.2017, 15:22:20 | Сообщение # 7 |  |   
|  |  | Сообщений: 67 Репутация: 1 [ +/- ]
 |  | Karandachik, http://rgho.st/6mQSysjls 
 Конечно, лучше было бы приаттачить к самому игроку модель. Но тут уже нужно смотреть, какие у тебя модельки, и есть ли вообще на дефолтном скелете, какой-нибудь, аттач у ног. А так, вскрыть модельку + добавить аттач.
 
 Добавлено (01.12.2017, 15:22:20)
 ---------------------------------------------
 WOW_NAMES, "Та завидуй молча уже!" - чему он должен завидовать то? Он сам напишет то, что хочет. И вообще, ты бы лучше поменьше писал, одну ересь от тебя вечно читаешь.
 
 
 Сообщение отредактировал Entity - Пятница, 01.12.2017, 15:45:15 |  |  |  |  |  | 
| Nail | Дата: Пятница, 01.12.2017, 20:57:51 | Сообщение # 8 |  |   
|  |  | Сообщений: 38 Репутация: 8 [ +/- ]
 |  | Entity, аттач не предиктится, лучше мержить кости. Ноги слишком сильно дергаются, самая стабильная точка - pivot 
 
 Сообщение отредактировал Nail - Пятница, 01.12.2017, 21:01:51 |  |  |  |  |  | 
| Entity | Дата: Пятница, 01.12.2017, 22:01:24 | Сообщение # 9 |  |   
|  |  | Сообщений: 67 Репутация: 1 [ +/- ]
 |  | Nail, угу, как вариант  |  |  |  |  |  | 
| Karandachik | Дата: Суббота, 02.12.2017, 06:40:21 | Сообщение # 10 |  |   
|  |  | Сообщений: 60 Репутация: 3 [ +/- ]
 |  | Nail, Entity, _R1KO_, Спасибо вам за старания, но мне уже помог WOW_NAMES, 
 Он тоже предложил сразу сделать привязку к скелету. Теперь уже после нового года, снова буду заниматься этой идеей там и модели и карта уже будут готовы.
 
 Всем спасибо мальчики, вы все мне помогаете всегда и форум ваш очень классный.
 Всех с наступающими праздниками и счастья вам!
  |  |  |  |  |  | 
| tonline_kms65 | Дата: Суббота, 06.01.2018, 05:53:27 | Сообщение # 11 |  |   
|  |  | Сообщений: 215 Репутация: 3 [ +/- ]
 |  | Для начала нужно знать куда собираешься прицепить, к какому (или каким) аттачам 3D модели.Я, для примера, взял модель зомби, у него скелет и аттачи те-же, что и у модели игрока.
 
 Добавлено (06.01.2018, 05:53:27)
 ---------------------------------------------
 Когда определишься - пишешь код, где цепляш к этим аттачам ENT со своей 3D моделью, я так понимаю у тебя код уже есть.
 После смерти, рестарте, реконекте и т.д. переменную, куда записана модель просто обнуляешь(или -1, в зависимости как объявишь переменную), а саму ENT с моделью ENT[client] убиваешь.
 Примерно так:
 
 
 Код HookEvent("round_start", Kill_all);HookEvent("player_spawn", Kill_);
 HookEvent("player_death", Kill_);
 
 public _Kill(Handle:event,const String:name[],bool:dontBroadcast){ // убиваешь свою ENT у убитого игрока
 int client = GetClientOfUserId(GetEventInt(event,"userid"));
 AcceptEntityInput(ENT[client], "Kill") ENT[client] = -1;
 }
 
 public Action:Kill_all(Handle:event, const String:name[], bool:dontBroadcast){
 for(new i = 1; i <= MaxClients; i++){ //здесь при рестарте убиваешь все свои ENT у всех игроков.
 AcceptEntityInput(ENT[i], "Kill") ENT[i] = -1;
 }
 Ну и так далее.
 
 | Гости не могут скачивать файлы | 
 
 
 Сообщение отредактировал tonline_kms65 - Суббота, 06.01.2018, 06:03:16 |  |  |  |  |  
 |