Скрипты только автоматизируют пакетное дело (заблокировать, изменить, отослать свой).
Чтобы писать скрипты нужно начать с концепта, идеи. Далее нужно думать как это реализовать. Если разбираешься в пакетном протоколе игры, то уже примерно знаешь какие пакеты тебе нужны, как они составлены итд. Если же разбираешься не очень, то можно посмотреть описание пакета в WPPC
или в разделе Пакетный уровень, но я советую отловить нужный пакет и самому разобраться какую информацию несут эти байты.
Далее переходим непосредственно к скриптописанию. Скрипты в WPPC пишутся на языке FS который имеет синтаксис Delphi ( можно посмотреть примеры использования).
Функции и процедуры поддерживаемые движком описаны в документации (с примерами). Она находятся в папке с WPPC (папка doc). В принципе тут можно заканчивать, но дам несколько советов.
В большинстве скриптов будут нужны функции перевода из одного типа в другой : IntToStr BufToHex итд запоминаем в первую очередь.
Далее функции преобразования строк (т.к. пакет по сути это строка) Delete, Insert, copy.
Функции составления пакетов FormatPck, FormatPck5 очень нужны когда используем переменные в пакете.
Ну и куда же без gSys.SendC, gSys.SendS, gBlockPacket для отправки и блокировки.
Байты в пакете идут задом наперед, т.е. если мы отловили пакет
PHP код:
09 00 17 07 00 01 00 00 00
то ID пакета будет $0717 ($ означает что это шестнадцатеричная система счисления)
procedure MsgInfo(msg : string); //Выводит информацию в пм
begin
gSys.SendC(FormatPck('%hcdacca',***91;$0A02,02,0,'***91;@***93;'+FStr(16),01,Length(msg),msg+#0***93;));
end;
...
MsgInfo('Hello world!');
..
Вот скелет который я использую в своих скриптах для рфки
PHP код:
//Скрипт пишется как для сервера без FG
//В случае использования процедур посылки пакетов сначала используем функцию FG() с желаемым пакетом как аргумент
//gSys.EnSendC(FG(тут могла бы быть ваша реклама));
var PID : integer; //Здесь объявляем свои переменные и константы
const fgFlag = true; //Меняем в зависимости от протокола
function FG(s:string): string;
begin
if fgFlag then result := FormatPck5('%sd',s,4)
else result := s;
end;
procedure OnCreate;
begin
//Тут код который надо выполнить до начала работы скрипта, например выставить флаг
end;
procedure OnDestroy;
begin
//Тут код который надо выполнить по завершению скрипта, например освободить память
end;
BEGIN
if fgFlag then _gBuff := copy(_gBuff,3,GInt(_gBuff,3,2));//Если FG разворачиваем
if length(_gBuff) < 4 then exit; //Размер меньше 4 байт. Это не RFО_о
PID := GInt(_gBuff,3,2); //Сохраним ID
if _gFromServ then //Пакеты от сервера
case PID of
$XXXX: begin
//Извращаемся над пакетом как хотим
end;
$AAAA,$BBBB: if thisthing = otherthing then
begin
//А эти только с условием
end;
end
else //Пакеты от клиента
case PID of
$YYYY: begin
//Снова извращения
end;
end;
end;
_gOutBuff := FG(_gOutBuff);//Если FG заворачиваем
END.
Может показаться слишком, но при скрипте в пару тысяч строк оно того стоит
Для тренировки могу посоветовать посмотреть на названия тем скриптов в этом разделе и попробовать написать свой (без подглядывания)