SA-MP Forums Archive
Скриптинг курилка - Printable Version

+- SA-MP Forums Archive (https://sampforum.blast.hk)
+-- Forum: Non-English (https://sampforum.blast.hk/forumdisplay.php?fid=9)
+--- Forum: Languages (https://sampforum.blast.hk/forumdisplay.php?fid=33)
+---- Forum: Русский/Russian (https://sampforum.blast.hk/forumdisplay.php?fid=32)
+---- Thread: Скриптинг курилка (/showthread.php?tid=111279)



Re: Скриптинг курилка - Stepashka - 01.02.2014

Quote:
Originally Posted by Kolstin
View Post
Это же полный бред, не кажется?
Если вы с этим не согласны - вас ни кто тут не держит.


Re: Скриптинг курилка - Stepashka - 01.02.2014

Quote:
Originally Posted by Urukhay
View Post
Немного о пикапах.
Когда мы создаем пикап, и хотим его в будущем удалить, нам надо запомнить его 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
View Post
Нет не так, путаницы не будут, просто перетрется старое значение и запишется новое. А вот если старый пикап не был удален, тогда он "потеряется".
При удалении несуществующего пикапа вообще ни чего не будет.
Давай рассуждать так, Степашка. У нас есть миссия, а вернее цель, задача, создавать пикапы к любому ТС, которые будут нести совершенно разное действие.
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
View Post
Видел кто-нибудь компилятор pawn под андроид? Стало интересно, а сам найти не могу.
Нет его. Кто-то уже интересовался.


Re: Скриптинг курилка - Stepashka - 01.02.2014

Quote:
Originally Posted by Urukhay
View Post
Давай рассуждать так, Степашка. У нас есть миссия, а вернее цель, задача, создавать пикапы к любому ТС, которые будут нести совершенно разное действие.
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
View Post
А теперь идите и читайте что такое идентификаторы, и за одно значение слова уникальный, и тогда только вы осознаете что двух пикапов с одинаковыми идентификаторами быть не может.
А ещё научитесь программировать не задумываясь что у вас храниться в переменной и какой по порядку идентификатор туда записался. Вас не должно это волновать. Если вы задались этим вопросом - значит ваш код неверен и требует доработки.
Ну дак очищение то и способствует тому, чтобы не задумываться, остался ли там ID пикапа от старой машины, пикап которой уже скрыт, но ID не очищен, и теперь, если мы вновь создали пикап с таким же записанным ID, а при проверке в цикле, машина с неочищенным ID первая, то будет вызываться пикап, который не относится к ней.


Re: Скриптинг курилка - Eims - 01.02.2014

Пока тут, хотелось бы задать вопрос у знающих людей, дабы не гадать.
Допустим, есть паблик OnPlayerUpdate (то бишь код будет вызываться часто). Будет ли различие между таким
PHP код:
if(variable[playerid] != 0variable[playerid] = 0
И таким
PHP код:
variable[playerid] = 0
вариантом кода (в плане меньшей нагрузки на сервер).
Понимаю, что нагрузка просто ничтожная и разницы особой не должно быть, но хочется узнать как будет лучше для машины


Re: Скриптинг курилка - Eims - 01.02.2014

Quote:
Originally Posted by Urukhay
View Post
Ну дак очищение то и способствует тому, чтобы не задумываться, остался ли там ID пикапа от старой машины, пикап которой уже скрыт, но ID не очищен, и теперь, если мы вновь создали пикап с таким же записанным ID, а при проверке в цикле, машина с неочищенным ID первая, то будет вызываться пикап, который не относится к ней.
А может всё дело в том, что пикап создаётся по первому свободному ID, который и равен 0? Попробуйте залогировать все действия, связанные с этими пикапами, отправляя инфу в консоль и посмотрите когда/как меняются данные.


Re: Скриптинг курилка - Urukhay - 01.02.2014

Quote:
Originally Posted by Eims
Посмотреть сообщение
Пока тут, хотелось бы задать вопрос у знающих людей, дабы не гадать.
Допустим, есть паблик OnPlayerUpdate (то бишь код будет вызываться часто). Будет ли различие между таким
PHP код:
if(variable[playerid] != 0variable[playerid] = 0
И таким
PHP код:
variable[playerid] = 0
вариантом кода (в плане меньшей нагрузки на сервер).
Понимаю, что нагрузка просто ничтожная и разницы особой не должно быть, но хочется узнать как будет лучше для машины
В любом случае, проверка, хоть и маленькая, несёт нагрузку. Если она без необходимости, то конечно второй вариант. Смотря что Вы планируете.


Re: Скриптинг курилка - Stepashka - 01.02.2014

Quote:
Originally Posted by Eims
Посмотреть сообщение
Пока тут, хотелось бы задать вопрос у знающих людей, дабы не гадать.
Допустим, есть паблик OnPlayerUpdate (то бишь код будет вызываться часто). Будет ли различие между таким
PHP код:
if(variable[playerid] != 0variable[playerid] = 0
И таким
PHP код:
variable[playerid] = 0
вариантом кода (в плане меньшей нагрузки на сервер).
Понимаю, что нагрузка просто ничтожная и разницы особой не должно быть, но хочется узнать как будет лучше для машины
Считаем количество операций:
    1. Сверяем значение
    2. Присваиваем значение
    1. Присваиваем значение
В первом случае, при variable[playerid] != 0 на одну операцию больше.


Re: Скриптинг курилка - Eims - 01.02.2014

Quote:
Originally Posted by Stepashka
Посмотреть сообщение
Считаем количество операций:
    1. Сверяем значение
    2. Присваиваем значение
    1. Присваиваем значение
В первом случае, при variable[playerid] != 0 на одну операцию больше.
Благодарю. Всё же я правильно думал. Просто ещё закралась мысль, мол проверка идёт быстрее присвоения и тогда в том же OnPlayerUpdate можно получить хоть мизерный, но прирост к скорости.Но это уже задротство какое-то было бы...


Re: Скриптинг курилка - Stepashka - 01.02.2014

Quote:
Originally Posted by Eims
View Post
А может всё дело в том, что пикап создаётся по первому свободному ID, который и равен 0? Попробуйте залогировать все действия, связанные с этими пикапами, отправляя инфу в консоль и посмотрите когда/как меняются данные.
ID ни когда не равен 0.


Re: Скриптинг курилка - Eims - 01.02.2014

Quote:
Originally Posted by Stepashka
View Post
ID ни когда не равен 0.
Возможно мой сервер сломан и работает против системы, но:
PHP Code:
printf("%d"CreatePickup(131823, -2027.6301, -40.684638.80470));
printf("%d"CreatePickup(131823, -2027.6301, -40.684638.80470));
new 
pick[2];//Код ниже уже так, ради самопроверки
pick[0] = CreatePickup(131823, -2027.6301, -40.684638.80470);
pick[1] = CreatePickup(131823, -2027.6301, -40.684638.80470);
printf("%d\n%d"pick[0], pick[1]); 
PHP Code:
[22:59:060
[22:59:061
[22:59:062

Возможно вы перепутали 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

Разработчики хотят оставить от игры саму игру. Сейчас, со всеми возросшими требованиями пользователей у меня складывается видение того, что от обычной гта по сути ничего и не останется кроме графического и физического движка.
ИМХО, если так и продолжать, легче написать что-то своего рода конструктора игры управляемый сервером, где скриптеры/программисты уже будут писать не сервер а саму игру воспроизводимый в итоге у клиента. И это будет куда выгодный путь, нежели разбирать движок вставлять костыли, ломать, переделывать.


Вот баги бы разрабы пофиксели, было бы здравое дело, качуют с времён зачатия.