Re: Скриптинг курилка -
Stepashka - 01.02.2014
Quote:
Originally Posted by Kolstin
Это же полный бред, не кажется?
|
Если вы с этим не согласны - вас ни кто тут не держит.
Re: Скриптинг курилка -
Stepashka - 01.02.2014
Quote:
Originally Posted by Urukhay
Немного о пикапах.
Когда мы создаем пикап, и хотим его в будущем удалить, нам надо запомнить его ID. Значит берем переменную, и присваиваем к ней создание пикапа.
Но при удалении пикапа по этой переменной, сама переменная ведь не очищается? И поэтому, если на этом же ID пикапа будет позже другое действие, ее надо очистить, иначе будет путаница ID. Ведь так?
И еще, что будет если удалить пикап, привязанный к пустой переменной, или даже удалить несуществующий пикап?
Вообщем объясню суть проблемы на примере. Есть команда, создающая в определенном месте, к переменной автомобиля пикап.
Code:
CMD:pick(playerid)
{
Veh[GetVehicleID(playerid)][Pickup] = CreatePickup(19131,23,x,y,z); // сами координаты непричем
return 1;
}
Таким образом мы будем садиться в разные автомобили, хоть в тысячу авто, все должно работать гладко, мы садимся, пикап создается, вылазим и в следующую. Но это нормально только при загрузке сервера. Теперь заглянем в другой паблик, а именно паблик OnVehicleSpawn:
Code:
OnVehicleSpawn(vehicleid)
{
DestroyPickup(vehicleid][Pickup]); //скрываем сам пикап
Veh[vehicleid][Pickup] = 0; // *
return 1;
}
Действие, которое я пометил "*" мы делаем потому, что если мы создадим очередной пикап, он займет ID только что заспавненного авто, так как мы скрыли пикап, а обнулять то кто будет? Вообщем так сказать антипутанница ID.
Ну так вот, после загрузки мода все в норме. Но стоит мне запустить спавн всех авто на сервере, а потом в первой попавшейся создать пикап, так странность! ID пикапа равен не 997(а он по идее должен быть такой), а равен НУЛЮ. Но если сядем в другое авто(после создания НУЛЕВОГО пикапа) и создадим следующий пикап, то опять все будет в норме до тех пор, пока не заспавним одну из машин! Если заспавнили, то опять первый созданный пикап после спавна авто пикап будет НУЛЕВОЙ! А потом опять все последующие пикапы под правильными ID, и так может до бесконечности (спавним, нулевой, норма..). В чем может быть проблема? Или какой совет дадите?
|
Нет не так, путаницы не будут, просто перетрется старое значение и запишется новое. А вот если старый пикап не был удален, тогда он "потеряется".
При удалении несуществующего пикапа вообще ни чего не будет.
Лучше делать так:
Code:
#define INVALID_PICKUP_ID (-1)
CMD:pick(playerid) {
new vehicleId = GetVehicleID(playerid);
if (!vehicleId) return 0;
if (Veh[vehicleId][Pickup] != INVALID_PICKUP_ID) {
DestroyPickup(Veh[vehicleId][Pickup]);
}
Veh[vehicleId][Pickup] = CreatePickup(19131,23,x,y,z);
return 1;
}
CMD:pickupDie(playerid) {
new vehicleId = GetVehicleID(playerid);
if (!vehicleId) return 0;
if (Veh[vehicleId][Pickup] != INVALID_PICKUP_ID) {
DestroyPickup(Veh[vehicleId][Pickup]);
}
Veh[vehicleId][Pickup] = INVALID_PICKUP_ID;
return 1;
}
А твоя путаница видимо в другом месте.
Re: Скриптинг курилка -
DrumYum - 01.02.2014
Видел кто-нибудь компилятор pawn под андроид? Стало интересно, а сам найти не могу.
Re: Скриптинг курилка -
Urukhay - 01.02.2014
Quote:
Originally Posted by Stepashka
Нет не так, путаницы не будут, просто перетрется старое значение и запишется новое. А вот если старый пикап не был удален, тогда он "потеряется".
При удалении несуществующего пикапа вообще ни чего не будет.
|
Давай рассуждать так, Степашка. У нас есть миссия, а вернее цель, задача, создавать пикапы к любому ТС, которые будут нести совершенно разное действие.
1. Создаем пикап на переменную в массиве с автомобилями. ( Veh[vehicleid][Pickup] = CreatePickup... )
Оно нам нужно для того, чтобы запомнить, что именно на этот автомобиль такое действие(Например выдача брони, если модель Infernus), но и мы знаем, что этот пикап должен быть с ID 997 - Допустим. Вот он создался на ID 997, все записано в переменную, автомобиль Infernus, пока все по курсу.
2. Идем в паблик вызова пикапов. Там ставим цикл на все автомобили, дабы найти пикап, привязанный именно к автомобилю с уникальным действием. Проверяем ( if(pickupid == Veh[v][Pickup])....// где v - компонент цикла )
3. Вот мы нашли совпадение, это действительно инфернус, выдаем броню, прячем пикап ( DestroyPickup(Veh[v][Pickup], Veh[v][Pickup] = 0 // а затем следом очищаем переменную, ниже объясняю подробней) )
Так зачем же мы все-таки очищаем ее? А вот зачем. Допустим следом же мы создали следующий пикап к ТС(но до удаления первого), вот у нас 2 пикапа, один ID 997, другой ID 998. Итак, создаем ТРЕТИЙ, НО перед его созданием удалим первый! А именно ID 997. И по логике он занимает ID 997. Но тут то и всплывет неочищенная переменная. Мы скрыли его и не очистили, значит в переменной на инфернусе до сих пор стоит циферка 997, а значит и цикл до сих пор будет сверять по его переменной. И тут мы создали третье авто, оно как говорится ранее заняло ID 997. Ну пусть будет Буллет.
И теперь у нас в массиве автомобилей есть 2 переменных с ОДИНАКОВЫМ ID. А значит, когда пойдет цикл, вызовется ПЕРВЕЙ ТО ДЕЙСТВИЕ, которое идет первей по циклу. И в итоге, встав на пикап Буллета нам выдаст бронежилет, который дается при присоединении пикапа к Инфернусу.
4. Спавн машин. Там тоже надо очищать, именно по этой конструкции.
Re: Скриптинг курилка -
Stepashka - 01.02.2014
Quote:
Originally Posted by DrumYum
Видел кто-нибудь компилятор pawn под андроид? Стало интересно, а сам найти не могу.
|
Нет его. Кто-то уже интересовался.
Re: Скриптинг курилка -
Stepashka - 01.02.2014
Quote:
Originally Posted by Urukhay
Давай рассуждать так, Степашка. У нас есть миссия, а вернее цель, задача, создавать пикапы к любому ТС, которые будут нести совершенно разное действие.
1. Создаем пикап на переменную в массиве с автомобилями. ( Veh[vehicleid][Pickup] = CreatePickup... )
Оно нам нужно для того, чтобы запомнить, что именно на этот автомобиль такое действие(Например выдача брони, если модель Infernus), но и мы знаем, что этот пикап должен быть с ID 997 - Допустим. Вот он создался на ID 997, все записано в переменную, автомобиль Infernus, пока все по курсу.
2. Идем в паблик вызова пикапов. Там ставим цикл на все автомобили, дабы найти пикап, привязанный именно к автомобилю с уникальным действием. Проверяем ( if(pickupid == Veh[v][Pickup])....// где v - компонент цикла )
3. Вот мы нашли совпадение, это действительно инфернус, выдаем броню, прячем пикап ( DestroyPickup(Veh[v][Pickup], Veh[v][Pickup] = 0 // а затем следом очищаем переменную, ниже объясняю подробней) )
Так зачем же мы все-таки очищаем ее? А вот зачем. Допустим следом же мы создали следующий пикап к ТС(но до удаления первого), вот у нас 2 пикапа, один ID 997, другой ID 998. Итак, создаем ТРЕТИЙ, НО перед его созданием удалим первый! А именно ID 997. И по логике он занимает ID 997. Но тут то и всплывет неочищенная переменная. Мы скрыли его и не очистили, значит в переменной на инфернусе до сих пор стоит циферка 997, а значит и цикл до сих пор будет сверять по его переменной. И тут мы создали третье авто, оно как говорится ранее заняло ID 997. Ну пусть будет Буллет.
И теперь у нас в массиве автомобилей есть 2 переменных с ОДИНАКОВЫМ ID. А значит, когда пойдет цикл, вызовется ПЕРВЕЙ ТО ДЕЙСТВИЕ, которое идет первей по циклу. И в итоге, встав на пикап Буллета нам выдаст бронежилет, который дается при присоединении пикапа к Инфернусу.
4. Спавн машин. Там тоже надо очищать, именно по этой конструкции.
|
А теперь идите и читайте что такое
идентификаторы, и за одно значение слова
уникальный, и тогда только вы осознаете что двух пикапов с одинаковыми идентификаторами быть не может.
А ещё научитесь программировать не задумываясь что у вас храниться в переменной и какой по порядку идентификатор туда записался. Вас не должно это волновать. Если вы задались этим вопросом - значит ваш код неверен и требует доработки.
Re: Скриптинг курилка -
Urukhay - 01.02.2014
Quote:
Originally Posted by Stepashka
А теперь идите и читайте что такое идентификаторы, и за одно значение слова уникальный, и тогда только вы осознаете что двух пикапов с одинаковыми идентификаторами быть не может.
А ещё научитесь программировать не задумываясь что у вас храниться в переменной и какой по порядку идентификатор туда записался. Вас не должно это волновать. Если вы задались этим вопросом - значит ваш код неверен и требует доработки.
|
Ну дак очищение то и способствует тому, чтобы не задумываться, остался ли там ID пикапа от старой машины, пикап которой уже скрыт, но ID не очищен, и теперь, если мы вновь создали пикап с таким же записанным ID, а при проверке в цикле, машина с неочищенным ID первая, то будет вызываться пикап, который не относится к ней.
Re: Скриптинг курилка -
Eims - 01.02.2014
Пока тут, хотелось бы задать вопрос у знающих людей, дабы не гадать.
Допустим, есть паблик OnPlayerUpdate (то бишь код будет вызываться часто). Будет ли различие между таким
PHP код:
if(variable[playerid] != 0) variable[playerid] = 0;
И таким
PHP код:
variable[playerid] = 0;
вариантом кода (в плане меньшей нагрузки на сервер).
Понимаю, что нагрузка просто ничтожная и разницы особой не должно быть, но хочется узнать как будет лучше для машины
Re: Скриптинг курилка -
Eims - 01.02.2014
Quote:
Originally Posted by Urukhay
Ну дак очищение то и способствует тому, чтобы не задумываться, остался ли там ID пикапа от старой машины, пикап которой уже скрыт, но ID не очищен, и теперь, если мы вновь создали пикап с таким же записанным ID, а при проверке в цикле, машина с неочищенным ID первая, то будет вызываться пикап, который не относится к ней.
|
А может всё дело в том, что пикап создаётся по первому свободному ID, который и равен 0? Попробуйте залогировать все действия, связанные с этими пикапами, отправляя инфу в консоль и посмотрите когда/как меняются данные.
Re: Скриптинг курилка -
Urukhay - 01.02.2014
Quote:
Originally Posted by Eims
Пока тут, хотелось бы задать вопрос у знающих людей, дабы не гадать.
Допустим, есть паблик OnPlayerUpdate (то бишь код будет вызываться часто). Будет ли различие между таким
PHP код:
if(variable[playerid] != 0) variable[playerid] = 0;
И таким
PHP код:
variable[playerid] = 0;
вариантом кода (в плане меньшей нагрузки на сервер).
Понимаю, что нагрузка просто ничтожная и разницы особой не должно быть, но хочется узнать как будет лучше для машины
|
В любом случае, проверка, хоть и маленькая, несёт нагрузку. Если она без необходимости, то конечно второй вариант. Смотря что Вы планируете.
Re: Скриптинг курилка -
Stepashka - 01.02.2014
Quote:
Originally Posted by Eims
Пока тут, хотелось бы задать вопрос у знающих людей, дабы не гадать.
Допустим, есть паблик OnPlayerUpdate (то бишь код будет вызываться часто). Будет ли различие между таким
PHP код:
if(variable[playerid] != 0) variable[playerid] = 0;
И таким
PHP код:
variable[playerid] = 0;
вариантом кода (в плане меньшей нагрузки на сервер).
Понимаю, что нагрузка просто ничтожная и разницы особой не должно быть, но хочется узнать как будет лучше для машины
|
Считаем количество операций:
- Сверяем значение
- Присваиваем значение
- Присваиваем значение
В первом случае, при
variable[playerid] != 0 на одну операцию больше.
Re: Скриптинг курилка -
Eims - 01.02.2014
Quote:
Originally Posted by Stepashka
Считаем количество операций: - Сверяем значение
- Присваиваем значение
- Присваиваем значение
В первом случае, при variable[playerid] != 0 на одну операцию больше.
|
Благодарю. Всё же я правильно думал. Просто ещё закралась мысль, мол проверка идёт быстрее присвоения и тогда в том же OnPlayerUpdate можно получить хоть мизерный, но прирост к скорости.Но это уже задротство какое-то было бы...
Re: Скриптинг курилка -
Stepashka - 01.02.2014
Quote:
Originally Posted by Eims
А может всё дело в том, что пикап создаётся по первому свободному ID, который и равен 0? Попробуйте залогировать все действия, связанные с этими пикапами, отправляя инфу в консоль и посмотрите когда/как меняются данные.
|
ID ни когда не равен 0.
Re: Скриптинг курилка -
Eims - 01.02.2014
Quote:
Originally Posted by Stepashka
ID ни когда не равен 0.
|
Возможно мой сервер сломан и работает против системы, но:
PHP Code:
printf("%d", CreatePickup(1318, 23, -2027.6301, -40.6846, 38.8047, 0));
printf("%d", CreatePickup(1318, 23, -2027.6301, -40.6846, 38.8047, 0));
new pick[2];//Код ниже уже так, ради самопроверки
pick[0] = CreatePickup(1318, 23, -2027.6301, -40.6846, 38.8047, 0);
pick[1] = CreatePickup(1318, 23, -2027.6301, -40.6846, 38.8047, 0);
printf("%d\n%d", pick[0], pick[1]);
PHP Code:
[22:59:06] 0
[22:59:06] 1
[22:59:06] 2
3
Возможно вы перепутали ID авто и ID пикапов. В первом ID точно не равен нулю и начинается с единицы. А вот во втором варианте логи говорят сами за себя.
Re: Скриптинг курилка -
OKStyle - 01.02.2014
Тут как бы смысл в этих действиях разный. Если надо по-любому обнулять, то обнуляйте, если нужна проверка - ставьте её. Быстрее не будет, будет по одной операции (если variable[playerid] == 0)
Re: Скриптинг курилка -
Urukhay - 01.02.2014
Такой вопрос. Вот есть стримеры, различные полезные плагины, командные процессоры, всякие YSI и т.п. Но строятся то все эти "дополнения" на базовых функциях которые разработала команда SA-MP? Или есть же "дополнения" вне формата .dll, то есть просто include, с более упрощенным кодом или логическим решением. А есть и "дополнения-плагины", работающие не только в виде include, но и с помощью плагинов .dll или .so. Так вот эти плагины позволяют создавать новые функции, такие, которых не разработали SA-MP Team? Ведь если не позволяют, то тогда смысл их включать в "дополнение"? И вообще, по какому принципу создаются "плагины" samp сервера?
Re: Скриптинг курилка -
Mutha_X - 01.02.2014
Quote:
Originally Posted by Urukhay
Такой вопрос. Вот есть стримеры, различные полезные плагины, командные процессоры, всякие YSI и т.п. Но строятся то все эти "дополнения" на базовых функциях которые разработала команда SA-MP? Или есть же "дополнения" вне формата .dll, то есть просто include, с более упрощенным кодом или логическим решением. А есть и "дополнения-плагины", работающие не только в виде include, но и с помощью плагинов .dll или .so. Так вот эти плагины позволяют создавать новые функции, такие, которых не разработали SA-MP Team? Ведь если не позволяют, то тогда смысл их включать в "дополнение"? И вообще, по какому принципу создаются "плагины" samp сервера?
|
Когда начнёшь изучать цпп, то поймёшь.
Re: Скриптинг курилка -
OKStyle - 01.02.2014
Quote:
Originally Posted by Urukhay
Так вот эти плагины позволяют создавать новые функции, такие, которых не разработали SA-MP Team?
|
Да. В плагинах идет работа с адресами (памяти).
Re: Скриптинг курилка -
lost13 - 01.02.2014
Quote:
Originally Posted by =KempeR=
Нет. Это позволит скриптерам изменять атмосферу GTA San Andreas
|
Ахах, помоему так все сейчас только этим и занимаются, как написал чувак выше - "Они хотят оставить самп именно SAN ANDREAS мультиплеер". Но ведь никто не говорит о замене карты, ведь сан андреас это штат. И почему бы не заменить/выключить HUD? Естественно с помощью текстдравов. Если бы самп был похож на СИНГЛ, т.е. прохождение миссий в онлайн режиме, хотя это уже хрень какая-то. Тогда можно было бы так говорить, что самп это именно САН АНДРЕАС мультиплеер. Но Разрабы походу давно не заходили на сервера, ибо там от ГТА ни осталось ничего кроме карты и персонажей. Я видел такие сервера что им и не снилось. Совершенно новое восприятие игры. Так может тогда небыло смысла продолжать девелопить самп? Темболее отключение радара/худа это стандартная фича ГТА, например во время какой-нибудь миссии/катсцены. Короче говоря иногда я не понимаю разрабов. Ясное дело с подгрузкой файлов и подобной мути. Но тут я честно говоря их не понимаю.
Re: Скриптинг курилка -
White_116 - 01.02.2014
Разработчики хотят оставить от игры саму игру. Сейчас, со всеми возросшими требованиями пользователей у меня складывается видение того, что от обычной гта по сути ничего и не останется кроме графического и физического движка.
ИМХО, если так и продолжать, легче написать что-то своего рода конструктора игры управляемый сервером, где скриптеры/программисты уже будут писать не сервер а саму игру воспроизводимый в итоге у клиента. И это будет куда выгодный путь, нежели разбирать движок вставлять костыли, ломать, переделывать.
Вот баги бы разрабы пофиксели, было бы здравое дело, качуют с времён зачатия.