Заказать игровой сервер Контакты (заказать плагин/исправить ошибки/другое) Пожертвовать Поиск

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

  • Страница 1 из 1
  • 1
Спасайте, застряла на половине пути.
Karandachik Дата: Четверг, 30.11.2017, 17:53:13 | Сообщение # 1
Сообщений: 60
Репутация: 3 [ +/- ]
Привет мальчики. Всех с наступающим новым годом! 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
Сообщений: 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 не поможет ей!
Девушка просит же кусок кода что бы увидеть и понять смысл (логику).
Исходя из прочитанного я понял, что тут необходимо написать код или дать похожий а уже поняв его она сама сможет дальше делать свой плагин.
xaxa
Даже не знаю что можно предложить ей, может что-нибудь из 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 [ +/- ]
О боже я думала проще будет все.
Мне не понять даже то, что вы написали, а про то как это самой сделать и говорить не приходиться. 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
Репутация: -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, угу, как вариант klas
 
Karandachik Дата: Суббота, 02.12.2017, 06:40:21 | Сообщение # 10
Сообщений: 60
Репутация: 3 [ +/- ]
Nail, Entity, _R1KO_, Спасибо вам за старания, но мне уже помог WOW_NAMES,

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

Всем спасибо мальчики, вы все мне помогаете всегда и форум ваш очень классный.
Всех с наступающими праздниками и счастья вам! klas
 
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
 
  • Страница 1 из 1
  • 1
Поиск: