Правила форума Гаранты форума
Размещение рекламы AMX-X компилятор

Здравствуйте, гость Вход | Регистрация

Наши новости:

14-дек
24-апр
10-апр
11-апр

многократный спаун ентити

cs-portal
сообщение 30.7.2013, 16:35
Сообщение #1
Стаж: 16 лет

Сообщений: 8181
Благодарностей: 2709
Полезность: 0

До меня только дошло, когда я писал плагин с нуля я для простоты поставил

set_task(35.0,"Spawn_Item",_,_,_,"b");


то бишь каждые 35 секунд из файла читаются координаты где нужно спаунить ентити, я так понимаю что КАЖДЫЕ 35 сек они тупо спаунятся одна в одной ) и в результате потом сервер упадет с ошибкой AD_ALLOC no free edicts
Обычно делают так - в начале раунда спаун, в конце раунда затирание, и снова спаун. Но у меня на сервере бесконечный раунд ....

Какие варианты есть чтобы задавать задачу спауна только по конкретной координате? например юзер поднял ентити, и по этим координатам задать task спауна
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   Цитировать сообщение
Статус пользователя Orty_Hart
сообщение 30.7.2013, 16:50
Сообщение #2
Стаж: 14 лет

Сообщений: 1399
Благодарностей: 408
Полезность: 725

cs-portal,
Если игрок посылает команду, записывайте в массив координаты, и потом по ним спавн делай
А по другому можно например где убили игрока....
Так-же я не понял что делать надо тебе)))
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
cs-portal
сообщение 30.7.2013, 16:55
Сообщение #3
Стаж: 16 лет

Сообщений: 8181
Благодарностей: 2709
Полезность: 0

не, итемы спаунятся строго по координатам, записанным в файл. просто если координат например 10 . а игрок поднял итем только с ОДНОЙ. то ЗАЧЕМ спаунить снова ентити в 9 оставшихся. если они там УЖЕ ЕСТЬ , вот этот вопрос надо как то решить

Самый простой выход который я вижу делать
remove_items перед spawn_items каждый раз,но это очень и очень грубо , такое не подходит,

не придумаю просто если игрок забрал ентити с одной координаты, то чтобы остальные не трогались, а именно эта появилась через 40 сек опять
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя neverminde
сообщение 30.7.2013, 17:01
Сообщение #4


Стаж: 15 лет

Сообщений: 1133
Благодарностей: 595
Полезность: 576

Цитата(cs-portal @ 30.7.2013, 16:55) *
не, итемы спаунятся строго по координатам, записанным в файл. просто если координат например 10 . а игрок поднял итем только с ОДНОЙ. то ЗАЧЕМ спаунить снова ентити в 9 оставшихся. если они там УЖЕ ЕСТЬ , вот этот вопрос надо как то решить

Момент поднятия ентити в булевский массив ставим 0.
aCookie[idCookie] = 0 //Печеньки нету

В таске
set_task(35.0,"Spawn_Item",_,_,_,"b");

for 0 to 9
{
if ( !aCookie[idCookie] ) // печеньки нет на месте.
spawn(idCookie) // спавн печеньки
}

spawn(idCookie)
{
createCookie() // создать печеньку
aCookie[idCookie] = 1
}

Отредактировал: neverminde, - 30.7.2013, 17:03
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
cs-portal
сообщение 30.7.2013, 17:04
Сообщение #5
Стаж: 16 лет

Сообщений: 8181
Благодарностей: 2709
Полезность: 0

мб мб
прогнать циклом по всем координатам, и где нехватает, тогда спаунить, попробуемс.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Orty_Hart
сообщение 30.7.2013, 22:03
Сообщение #6
Стаж: 14 лет

Сообщений: 1399
Благодарностей: 408
Полезность: 725

cs-portal,
а просто set_task(35.0,"Spawn_Item"); не?
или нужно постоянно?
попробуй сделать так:

Код
#include <amxmodx>
#include <amxmisc>

public plugin_init() {
    
    register_plugin("Round_Start", "1.0", "Sutar")

    register_logevent("StartRound", 2, "1=Round_Start")
    

}
public StartRound(){
      set_task(35.0,"Spawn_Item");
}


т.е. отслеживай старт раунда, после делай 1 спавн. и всё...

Отредактировал: Orty_Hart, - 30.7.2013, 22:03
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
cs-portal
сообщение 30.7.2013, 22:24
Сообщение #7
Стаж: 16 лет

Сообщений: 8181
Благодарностей: 2709
Полезность: 0

такое тоже не катит, просто потому что если юзер не подберет их они будут спаунится снова одна в одной, а раунд никогда незакончится, как я уже писал, тото я и понял откуда баг возникал когда берешь ентити, то она не исчезает ( хотя прописано remove_entity ) а остается еще на 1 раз =- видимо заспаунило там же повторно)

лучше действительно присвоить чтото дополнительно каждой ентити и дальше уже конкретно с каждой разбиратся
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Orty_Hart
сообщение 30.7.2013, 22:37
Сообщение #8
Стаж: 14 лет

Сообщений: 1399
Благодарностей: 408
Полезность: 725

cs-portal,
т.е. если я выкинул на карту 5 стволов, 4 из них подобрали на их месте не стволов...
и ты хочешь чтоб там где нет стволов снова появился ствол? всё правильно?

cs-portal,
во придумал что
это комне пришло в последнею минуту
смотри
ловы события коман сервера, после делай проверку, чтоб была команда "Поднять оружия"
потом, вычесляем по id игрока, который поднял ствол,
проверяем чтоб то был ствол который нам нужен
если ствол совпал, бери координаты игрока и все координаты стволов и делай проверку +/-10 по координатам x:y:z
если примерные координаты совпадают, (например сделали for(0-5) и там совпал координаты на 4, останавливаем проверку и выдаем оружия по заранее заданным координатам для 4 места).
примерно понял что я сказал??)))

ловым события:

Код
public CS_InternalCommand(id, const cmd[])
    client_print(id, print_chat, "Command_name is: %s", Cmd)

public client_command(id)
{
    new cmd[13]
    read_argv(0, cmd, 12)
    client_print(id, print_chat, "Command_name is: %s", Cmd)
}


потом, подними ствол на сервере, и посмотри что напишет (какая команда будет)
потом делай проверку:

Код
if(equali(cmd, "[команда поднять ствол]"))


потом если есть такая команда, делай проверку чтоб то был ствол который нам нужен:
Код
if(equali(cmd, "[ствол который нам нужен (sg550, shield...)]"))


и ловы координаты игрока...

Код
new vOrigin[3]
get_user_origin(id, vOrigin)


если я не ошибаюсь, нужен модуль #include <fakemeta>

потом делай проверку типо
Код
if(координат ствола > vOrigin-10 && координат ствола < vOrigin-10)

делай проверку по vOrigin[0], vOrigin[1] и vOrigin[2]

если есть true делай return и кидай валыну по Id

Отредактировал: Orty_Hart, - 30.7.2013, 22:47
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
cs-portal
сообщение 30.7.2013, 22:42
Сообщение #9
Стаж: 16 лет

Сообщений: 8181
Благодарностей: 2709
Полезность: 0

ты забываешь что ячеек для owner или EV_INT_iuser1,
EV_INT_iuser2,
EV_INT_iuser3,
EV_INT_iuser4,

мало. короче выход такой я думаю - банальный = при спауне ентити делаем entity think и все .....
хотя я счас все таки сделаю определение ентити по указанным координатам
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Orty_Hart
сообщение 30.7.2013, 22:50
Сообщение #10
Стаж: 14 лет

Сообщений: 1399
Благодарностей: 408
Полезность: 725

cs-portal,
ну другого выхода я не вижу...
примерный выход я тебе дал...
кстати EV_INT_iuser1... типо ст. координаты игрока???
а что мешает просто вставить им в руки ствол??
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Andrei
сообщение 30.7.2013, 23:54
Сообщение #11


Стаж: 15 лет

Сообщений: 1335
Благодарностей: 693
Полезность: 740

Почему бы не контролировать кол-во уже спавнущихся коробок и делать их лимит? То есть,перед спавном проверять,если в данный момент лежит 9 коробок,выходим из функции и возвращаем заново таск.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
cs-portal
сообщение 31.7.2013, 0:37
Сообщение #12
Стаж: 16 лет

Сообщений: 8181
Благодарностей: 2709
Полезность: 0

проблема в том что функция спаунит их все Одновременно и не больше указанного лимита (10 штук)

если сделать как ты говоришь, тогда у нас 9 = игрок поднял одну = 8 и она снова заспаунит по всем координатам сразу)


а нужно сначала спаунить одновременно а потом уже только ту которую подобрали через 30 сек

Я конечно могу получить координаты игрока в момент поднятия и по ним же спаунить через таск. я просто боюсь что координаты будут чуть плавать, ведь ентити имеет mins/max а игрок тоже ведь бежит.

самое эффективное это считать координаты из файла и чекнуть наличие энтити по ним и спаунить по оставшимся. но я с записанными координатами почти не работал sorry.gif
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
cs-portal
сообщение 31.7.2013, 5:22
Сообщение #13
Стаж: 16 лет

Сообщений: 8181
Благодарностей: 2709
Полезность: 0

для одиночной ентити, пофиксил так

new iEnt = -1;
while((iEnt = find_ent_by_class(iEnt, "gg_grenade")) != 0) return PLUGIN_CONTINUE
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Orty_Hart
сообщение 31.7.2013, 8:15
Сообщение #14
Стаж: 14 лет

Сообщений: 1399
Благодарностей: 408
Полезность: 725

cs-portal,
Так яж говорил
Делай проверку в +/-10 по оси x:y:z и если пушка какаято попала в период, делай спавн уже по координатам пушки
Прочитай внимательно
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
  Ответить в данную темуНачать новую тему
 
0 пользователей и 1 гостей читают эту тему: