Как переконвектировать pwn скрипты из 0.1b в 0.2
У многих могут возникнуть проблемы по поводу перевода скриптов из 0.1 в 0.2. Причина в том, что в 0.2 версии сервера появился новый компилятор, который оказался очень требовательным. Поэтому в скрипт придется внести ряд небольших изменений.
Пример:
Неправильный вариант:
public PlayerName(playerid) { // в этой строчке неправильное слово - public, потому что функция (public) не могут теперь возвращать строки или массивы. Также эта функция не повешена на таймер, поэтому используйте stock вместо public new name[255]; // в этой строчке пропущены пробелы. Поставьте 4 пробела или один TAB. if (IsPlayerConnected(playerid)) { // в этой строчке пропущены пробелы. Поставьте 4 пробела или один TAB. GetPlayerName(playerid, name, MAX_STRING); // в этой строчке пропущены пробелы. Поставьте 8 пробелов или два TAB. } // в этой строчке пропущены пробелы. Поставьте 4 пробела или один TAB. else name[0]=0; // пропущены пробелы или строка должна быть перемещена на предыдущую строчку. return name; // в этой строчке пропущены пробелы. Поставьте 4 пробела или один TAB. }
Правильный вариант:
stock PlayerName(playerid) { new name[255]; if (IsPlayerConnected(playerid)) { GetPlayerName(playerid, name, MAX_STRING); } else name[0]=0; return name; }
Детали:
Ошибка 217: loose indentation
Это как раз та ошибка в тех строчках где не хватает пробелов или TAB
Ошибка 235: public function lacks forward declaration
Это так ошибка, когда не хватает forward.
Для функций,повешенных на таймер в начале скрипта пишется:
forward NameFunction(params);
для остальных, кроме (они уже отфорвадены в a_samp.inc)
OnGameModeInit();
OnGameModeExit();
OnFilterScriptInit();
OnFilterScriptExit();
OnPlayerConnect(playerid);
OnPlayerDisconnect(playerid, reason);
OnPlayerSpawn(playerid);
OnPlayerDeath(playerid, killerid, reason);
OnVehicleSpawn(vehicleid);
OnVehicleDeath(vehicleid, killerid);
OnPlayerText(playerid, text[]);
OnPlayerCommandText(playerid, cmdtext[]);
OnPlayerInfoChange(playerid);
OnPlayerRequestClass(playerid, classid);
OnPlayerEnterVehicle(playerid, vehicleid, ispassenger);
OnPlayerExitVehicle(playerid, vehicleid);
OnPlayerStateChange(playerid, newstate, oldstate);
OnPlayerEnterCheckpoint(playerid);
OnPlayerLeaveCheckpoint(playerid);
OnPlayerEnterRaceCheckpoint(playerid);
OnPlayerLeaveRaceCheckpoint(playerid);
OnRconCommand(cmd[]);
OnPlayerPrivmsg(playerid, recieverid, text[]);
OnPlayerRequestSpawn(playerid);
OnObjectMoved(objectid);
OnPlayerObjectMoved(playerid, objectid);
OnPlayerPickUpPickup(playerid, pickupid);
OnVehicleMod(vehicleid, componentid);
OnVehiclePaintjob(vehicleid, paintjobid);
OnVehicleRespray(vehicleid, color1, color2);
OnPlayerSelectedMenuRow(playerid, row);
OnPlayerExitedMenu(playerid);
OnPlayerInteriorChange(playerid, newinteriorid, oldinteriorid);
OnPlayerKeyStateChange(playerid, newkeys, oldkeys);
public заменяется на stock
также чтобы не мучаться с ошибками loose indentation достаточно в начале скрипта написать строчку:
#pragma tabsize 0
P.S. в a_samp.inc прописано (#pragma tabsize 4)
также рublic функции теперь не могут возвращать строки или массивы a, все остальные значения - спокойно.
Форвардить нужно все свои public-функции, а не только те, что поставлены на таймер.
ну вроде все.
Удачи,
LuxurY