Спасайте, застряла на половине пути.
| |
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 |
|
| |
|