Заказать Сервер Заказать Плагин Контакты Поиск

[ вход ]
[ последние сообщения ]

Страница 1 из 11
Форум » SourceMod - Counter Strike Source && CS GO » Обсуждение » Спасайте, застряла на половине пути. (Плагин пишу для своего сервера, нужны примеры кода.)
Спасайте, застряла на половине пути.
Karandachik Дата: Четверг, 30.11.2017, 17:53:13 | Сообщение # 1
Сообщений: 19
Репутация: 1 [ +/- ]
Привет мальчики. Всех с наступающим новым годом! happy
Желаю в новом году всем любви и счастья.
Пусть в новом году у всех сбудутся все мечты, пусть каждый найдет свою половинку.

Хочу написать плагин для 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
Сообщений: 26
Репутация: 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
Репутация: -2 [ +/- ]
Nail, Спорим, что отсылка на new-api не поможет ей!
Девушка просит же кусок кода что бы увидеть и понять смысл (логику).
Исходя из прочитанного я понял, что тут необходимо написать код или дать похожий а уже поняв его она сама сможет дальше делать свой плагин.
xaxa
Даже не знаю что можно предложить ей, может что-нибудь из props мода или из плагинов с моделью с4 =).
 
_R1KO_ Дата: Четверг, 30.11.2017, 23:23:55 | Сообщение # 4
Сообщений: 188
Репутация: 28 [ +/- ]
Цитата 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
Сообщений: 19
Репутация: 1 [ +/- ]
О боже я думала проще будет все.
Мне не понять даже то, что вы написали, а про то как это самой сделать и говорить не приходиться. grust
Н-да уж.........

Может кто то поможет мне и напишет плагин?
Заплачу в пределах разумного.
PS Хочется бесплатно конечно, если можно конечно. ulibka

Добавлено (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
Репутация: -2 [ +/- ]
Цитата _R1KO_ ()
как и тебе, любитель получать готовый код.

Та завидуй молча уже!
Karandachik, Напиши сразу владельцу форума, че мучаешься то?
 
Entity Дата: Пятница, 01.12.2017, 15:22:20 | Сообщение # 7
Сообщений: 50
Репутация: 2 [ +/- ]
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
Сообщений: 26
Репутация: 8 [ +/- ]
Entity, аттач не предиктится, лучше мержить кости. Ноги слишком сильно дергаются, самая стабильная точка - pivot


Сообщение отредактировал Nail - Пятница, 01.12.2017, 21:01:51
 
Entity Дата: Пятница, 01.12.2017, 22:01:24 | Сообщение # 9
Сообщений: 50
Репутация: 2 [ +/- ]
Nail, угу, как вариант klas
 
Karandachik Дата: Суббота, 02.12.2017, 06:40:21 | Сообщение # 10
Сообщений: 19
Репутация: 1 [ +/- ]
Nail, Entity, _R1KO_, Спасибо вам за старания, но мне уже помог WOW_NAMES,

Он тоже предложил сразу сделать привязку к скелету. Теперь уже после нового года, снова буду заниматься этой идеей там и модели и карта уже будут готовы.

Всем спасибо мальчики, вы все мне помогаете всегда и форум ваш очень классный.
Всех с наступающими праздниками и счастья вам! klas
 
Форум » SourceMod - Counter Strike Source && CS GO » Обсуждение » Спасайте, застряла на половине пути. (Плагин пишу для своего сервера, нужны примеры кода.)
Страница 1 из 11
Поиск: