01.02.2014, 12:35
Скриптинг курилка
01.02.2014, 12:46
Quote:
Немного о пикапах.
Когда мы создаем пикап, и хотим его в будущем удалить, нам надо запомнить его ID. Значит берем переменную, и присваиваем к ней создание пикапа. Но при удалении пикапа по этой переменной, сама переменная ведь не очищается? И поэтому, если на этом же ID пикапа будет позже другое действие, ее надо очистить, иначе будет путаница ID. Ведь так? И еще, что будет если удалить пикап, привязанный к пустой переменной, или даже удалить несуществующий пикап? Вообщем объясню суть проблемы на примере. Есть команда, создающая в определенном месте, к переменной автомобиля пикап. Code:
CMD:pick(playerid) { Veh[GetVehicleID(playerid)][Pickup] = CreatePickup(19131,23,x,y,z); // сами координаты непричем return 1; } Code:
OnVehicleSpawn(vehicleid) { DestroyPickup(vehicleid][Pickup]); //скрываем сам пикап Veh[vehicleid][Pickup] = 0; // * return 1; } Ну так вот, после загрузки мода все в норме. Но стоит мне запустить спавн всех авто на сервере, а потом в первой попавшейся создать пикап, так странность! 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; }
01.02.2014, 12:53
Видел кто-нибудь компилятор pawn под андроид? Стало интересно, а сам найти не могу.
01.02.2014, 13:11
Quote:
Нет не так, путаницы не будут, просто перетрется старое значение и запишется новое. А вот если старый пикап не был удален, тогда он "потеряется".
При удалении несуществующего пикапа вообще ни чего не будет. |
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. Спавн машин. Там тоже надо очищать, именно по этой конструкции.
01.02.2014, 13:12
01.02.2014, 13:17
Quote:
Давай рассуждать так, Степашка. У нас есть миссия, а вернее цель, задача, создавать пикапы к любому ТС, которые будут нести совершенно разное действие.
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. Спавн машин. Там тоже надо очищать, именно по этой конструкции. |
А ещё научитесь программировать не задумываясь что у вас храниться в переменной и какой по порядку идентификатор туда записался. Вас не должно это волновать. Если вы задались этим вопросом - значит ваш код неверен и требует доработки.
01.02.2014, 13:20
Quote:
А теперь идите и читайте что такое идентификаторы, и за одно значение слова уникальный, и тогда только вы осознаете что двух пикапов с одинаковыми идентификаторами быть не может.
А ещё научитесь программировать не задумываясь что у вас храниться в переменной и какой по порядку идентификатор туда записался. Вас не должно это волновать. Если вы задались этим вопросом - значит ваш код неверен и требует доработки. |
01.02.2014, 14:00
Пока тут, хотелось бы задать вопрос у знающих людей, дабы не гадать.
Допустим, есть паблик OnPlayerUpdate (то бишь код будет вызываться часто). Будет ли различие между таким
И таким
вариантом кода (в плане меньшей нагрузки на сервер).
Понимаю, что нагрузка просто ничтожная и разницы особой не должно быть, но хочется узнать как будет лучше для машины
Допустим, есть паблик OnPlayerUpdate (то бишь код будет вызываться часто). Будет ли различие между таким
PHP код:
if(variable[playerid] != 0) variable[playerid] = 0;
PHP код:
variable[playerid] = 0;
Понимаю, что нагрузка просто ничтожная и разницы особой не должно быть, но хочется узнать как будет лучше для машины
01.02.2014, 14:02
Quote:
Ну дак очищение то и способствует тому, чтобы не задумываться, остался ли там ID пикапа от старой машины, пикап которой уже скрыт, но ID не очищен, и теперь, если мы вновь создали пикап с таким же записанным ID, а при проверке в цикле, машина с неочищенным ID первая, то будет вызываться пикап, который не относится к ней.
|
01.02.2014, 14:10
Quote:
Пока тут, хотелось бы задать вопрос у знающих людей, дабы не гадать.
Допустим, есть паблик OnPlayerUpdate (то бишь код будет вызываться часто). Будет ли различие между таким PHP код:
PHP код:
Понимаю, что нагрузка просто ничтожная и разницы особой не должно быть, но хочется узнать как будет лучше для машины |
01.02.2014, 14:11
Quote:
Пока тут, хотелось бы задать вопрос у знающих людей, дабы не гадать.
Допустим, есть паблик OnPlayerUpdate (то бишь код будет вызываться часто). Будет ли различие между таким PHP код:
PHP код:
Понимаю, что нагрузка просто ничтожная и разницы особой не должно быть, но хочется узнать как будет лучше для машины |
- Сверяем значение
- Присваиваем значение
- Присваиваем значение
01.02.2014, 14:16
Благодарю. Всё же я правильно думал. Просто ещё закралась мысль, мол проверка идёт быстрее присвоения и тогда в том же OnPlayerUpdate можно получить хоть мизерный, но прирост к скорости.Но это уже задротство какое-то было бы...
01.02.2014, 14:25
01.02.2014, 14:44
Возможно мой сервер сломан и работает против системы, но:
Возможно вы перепутали ID авто и ID пикапов. В первом ID точно не равен нулю и начинается с единицы. А вот во втором варианте логи говорят сами за себя.
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
01.02.2014, 15:11
Тут как бы смысл в этих действиях разный. Если надо по-любому обнулять, то обнуляйте, если нужна проверка - ставьте её. Быстрее не будет, будет по одной операции (если variable[playerid] == 0)
01.02.2014, 15:56
Такой вопрос. Вот есть стримеры, различные полезные плагины, командные процессоры, всякие YSI и т.п. Но строятся то все эти "дополнения" на базовых функциях которые разработала команда SA-MP? Или есть же "дополнения" вне формата .dll, то есть просто include, с более упрощенным кодом или логическим решением. А есть и "дополнения-плагины", работающие не только в виде include, но и с помощью плагинов .dll или .so. Так вот эти плагины позволяют создавать новые функции, такие, которых не разработали SA-MP Team? Ведь если не позволяют, то тогда смысл их включать в "дополнение"? И вообще, по какому принципу создаются "плагины" samp сервера?
01.02.2014, 15:59
Quote:
Такой вопрос. Вот есть стримеры, различные полезные плагины, командные процессоры, всякие YSI и т.п. Но строятся то все эти "дополнения" на базовых функциях которые разработала команда SA-MP? Или есть же "дополнения" вне формата .dll, то есть просто include, с более упрощенным кодом или логическим решением. А есть и "дополнения-плагины", работающие не только в виде include, но и с помощью плагинов .dll или .so. Так вот эти плагины позволяют создавать новые функции, такие, которых не разработали SA-MP Team? Ведь если не позволяют, то тогда смысл их включать в "дополнение"? И вообще, по какому принципу создаются "плагины" samp сервера?
|
01.02.2014, 16:15
01.02.2014, 17:38
Ахах, помоему так все сейчас только этим и занимаются, как написал чувак выше - "Они хотят оставить самп именно SAN ANDREAS мультиплеер". Но ведь никто не говорит о замене карты, ведь сан андреас это штат. И почему бы не заменить/выключить HUD? Естественно с помощью текстдравов. Если бы самп был похож на СИНГЛ, т.е. прохождение миссий в онлайн режиме, хотя это уже хрень какая-то. Тогда можно было бы так говорить, что самп это именно САН АНДРЕАС мультиплеер. Но Разрабы походу давно не заходили на сервера, ибо там от ГТА ни осталось ничего кроме карты и персонажей. Я видел такие сервера что им и не снилось. Совершенно новое восприятие игры. Так может тогда небыло смысла продолжать девелопить самп? Темболее отключение радара/худа это стандартная фича ГТА, например во время какой-нибудь миссии/катсцены. Короче говоря иногда я не понимаю разрабов. Ясное дело с подгрузкой файлов и подобной мути. Но тут я честно говоря их не понимаю.
01.02.2014, 18:00
Разработчики хотят оставить от игры саму игру. Сейчас, со всеми возросшими требованиями пользователей у меня складывается видение того, что от обычной гта по сути ничего и не останется кроме графического и физического движка.
ИМХО, если так и продолжать, легче написать что-то своего рода конструктора игры управляемый сервером, где скриптеры/программисты уже будут писать не сервер а саму игру воспроизводимый в итоге у клиента. И это будет куда выгодный путь, нежели разбирать движок вставлять костыли, ломать, переделывать.
Вот баги бы разрабы пофиксели, было бы здравое дело, качуют с времён зачатия.
ИМХО, если так и продолжать, легче написать что-то своего рода конструктора игры управляемый сервером, где скриптеры/программисты уже будут писать не сервер а саму игру воспроизводимый в итоге у клиента. И это будет куда выгодный путь, нежели разбирать движок вставлять костыли, ломать, переделывать.
Вот баги бы разрабы пофиксели, было бы здравое дело, качуют с времён зачатия.
« Next Oldest | Next Newest »
Users browsing this thread: 31 Guest(s)