Автоматоны в Pawn
В Pawn есть, так сказать система "состояний". Которая позволяет объявить несколько копий функций для использования в разных условиях.
Пример
Допустим нам нужно сохранить разные данные, например дома и игроков.
#include <a_samp>
enum
{
sdPlayers,
sdHouses,
};
/* Или:
#define sdPlayers 0
#define sdHouses 1
*/
public PublicName1() //какой-то паблик, который должен будет вызваться для сохранения данных
{
//сохраняем данные
SaveData(sdPlayers);
SaveData(sdHouses);
return 1;
}
public PublicName2() //какой-то паблик, который должен будет вызваться для обновления данных
{
//обновляем данные, например иконки и пикапы домов
UpdateData(sdPlayers);
UpdateData(sdHouses);
return 1;
}
stock SaveData(type)
{
switch(type)
{
case sdPlayers:
{
//сохраняем игроков
}
case sdHouses:
{
//сохраняем дома
}
}
return 1;
}
stock UpdateData(type)
{
switch(type)
{
case sdPlayers:
{
//обновляем данные
}
case sdHouses:
{
//обновляем данные
}
}
return 1;
}
Согласитесь, вторая конструкция выглядит более приятней, ведь так?
Теория
Например устанавливаем для data состояние houses:
state data:houses;
Для условий с автоматонами есть сокращённое написание кода:
state (gettime() > 30000000) data:houses;
//или
state (var == 0 || var > 200) data:houses;
Выше код, тоже самое что и:
if(gettime() > 30000000)
{
state data:houses;
}
//или
if(var == 0 || var > 200)
{
state data:houses;
}
main()
{
printf("Hello");
state EntryTest:helloworld;
printf("World!");
}
entry() <EntryTest:helloworld>
{
printf(",");
}
Результатом будет:
Hello
,
World!
Функции
Вы можете объявлять функции с одним состоянием:
stock echo(msg[]) <exTypene>
{
print(msg);
}
Или с несколькими:
stock echo(msg[]) <exTypene,exType:two>
{
print(msg);
}
^^^ Данная функция будет вызвана при состоянии one и two. ^^^
Или с любым другим состоянием:
stock echo(msg[]) <>
{
print(msg);
}
^^^ Данная функция будет вызвана если не было вызвано ни одной функции со своим состоянием ^^^
Автор: ziggi
Источник: Автоматоны Pawn
В Pawn есть, так сказать система "состояний". Которая позволяет объявить несколько копий функций для использования в разных условиях.
Пример
Допустим нам нужно сохранить разные данные, например дома и игроков.
- Обычная реализация
#include <a_samp>
enum
{
sdPlayers,
sdHouses,
};
/* Или:
#define sdPlayers 0
#define sdHouses 1
*/
public PublicName1() //какой-то паблик, который должен будет вызваться для сохранения данных
{
//сохраняем данные
SaveData(sdPlayers);
SaveData(sdHouses);
return 1;
}
public PublicName2() //какой-то паблик, который должен будет вызваться для обновления данных
{
//обновляем данные, например иконки и пикапы домов
UpdateData(sdPlayers);
UpdateData(sdHouses);
return 1;
}
stock SaveData(type)
{
switch(type)
{
case sdPlayers:
{
//сохраняем игроков
}
case sdHouses:
{
//сохраняем дома
}
}
return 1;
}
stock UpdateData(type)
{
switch(type)
{
case sdPlayers:
{
//обновляем данные
}
case sdHouses:
{
//обновляем данные
}
}
return 1;
}
- Реализация через автоматоны
Код:
/* gamemode */
#include <a_samp>
public PublicName1() //какой-то паблик, который должен будет вызваться для сохранения игроков
{
state SDType:players;
SaveData();
return 1;
}
public PublicName2() //какой-то паблик, который должен будет вызваться для сохранения и обновления данных домов
{
state SDType:houses;
SaveData();
UpdateData();
return 1;
}
stock SaveData() <SDType:players>
{
//сохраняем игроков
return 1;
}
stock SaveData() <SDType:houses>
{
//сохраняем дома
return 1;
}
stock UpdateData() <SDType:players>
{
//обновляем игроков
return 1;
}
stock UpdateData() <SDType:houses>
{
//обновляем дома
return 1;
}
Теория
- state
Например устанавливаем для data состояние houses:
state data:houses;
Для условий с автоматонами есть сокращённое написание кода:
state (gettime() > 30000000) data:houses;
//или
state (var == 0 || var > 200) data:houses;
Выше код, тоже самое что и:
if(gettime() > 30000000)
{
state data:houses;
}
//или
if(var == 0 || var > 200)
{
state data:houses;
}
- entry
main()
{
printf("Hello");
state EntryTest:helloworld;
printf("World!");
}
entry() <EntryTest:helloworld>
{
printf(",");
}
Результатом будет:
Hello
,
World!
Функции
Вы можете объявлять функции с одним состоянием:
stock echo(msg[]) <exTypene>
{
print(msg);
}
Или с несколькими:
stock echo(msg[]) <exTypene,exType:two>
{
print(msg);
}
^^^ Данная функция будет вызвана при состоянии one и two. ^^^
Или с любым другим состоянием:
stock echo(msg[]) <>
{
print(msg);
}
^^^ Данная функция будет вызвана если не было вызвано ни одной функции со своим состоянием ^^^
Автор: ziggi
Источник: Автоматоны Pawn
Последнее редактирование модератором: