Пельмень
Компетентный
Сегодня кароче был классный день. Однако здравствуйте с вами Пельмень. Я бы хотел поделиться с вами небольшим уроком для ускорения итерации разных систем. Хотел бы подчеркнуть, что данный урок будет актуален в основном для динамических систем. В остальных случаях просто нет смысла использовать данную статью.
Итак начнём.
Создание цикла:
Для подсчёта числа сохранённого в итераторе мы будем использовать:
В принципе урок закончен, по всем недочётам если такие имеются пишем в тему. Внимание: Это эксперементальная версия, Возможны краши(При мне таких не имелось). Но это уже совсем другая история.
Пример цельной системы:
Автор урока: Пельмень
Автор форича: Y_Less
---------- Post added at 23:04 ---------- Previous post was at 22:16 ----------
Обновил. Добавил небольшой пример использования с использованием: D_CMD, sscanf2, MySQL r7
Итак начнём.
- Для начала создаём инклюд, код которого мы возьмём
Чтобы видеть скрытое содержание Зарегистрируйтесь на форуме!. Внимание это эксперементальная версия.
- Далее создаём переменную.
PHP:new Iterator:Houses<100>; // Объявляем итератор для будущего использования. Где 100 это число максимальных домов на сервере.. - В OnGameModeExit добавим:
PHP:Iter_Clear(Houses);//Сбрасываем итератор, при этом удаляя из него все данные. - В функцию/диалог/комманду создания дома и п.р добавляем
PHP:Iter_Add(Houses, Iter_Count(Houses)+1);//Прибавляем к итератору 1 new house = Iter_Count(Houses);//Потребуется нам для дальнейших действий с созданным домом (Если есть необходимость, в других случаях не используем.) - В функцию с загрузкой домов или другой сис-мы.
PHP:Iter_Add(Houses,Iter_Count(Houses)+1);//Прибавляем к итератору 1. ВНИМАНИЕ: Данный код нужно добавлять в цикл с загрузкой домов или п.р сис-мы
Создание цикла:
PHP:
foreach(new idx:Houses){ /*code here*/ }
PHP:
Iter_Count(Houses);
Пример цельной системы:
PHP:
#define MAX_HOUSES ( 100 )
new Iterator:Houses<MAX_HOUSES>;
enum h_Info {
ID,
Float: posX,
Float: posY,
Float: posZ,
Interior
} new houseInfo[ MAX_HOUSES ] [ h_Info ] ;
forward public HousesCallBack() ;
public HousesCallBack() { //Загружаем дома
new
rows,
fields,
sz_Query[ 128 ]
;
cache_get_data( rows, fields ) ;
if ( rows ) {
for ( new idx; idx < rows; idx++ ) {
cache_get_row( idx, 0, sz_Query ), houseInfo[ idx ] [ ID ] = strval( sz_Query ) ;
cache_get_row( idx, 1, sz_Query ), houseInfo[ idx ] [ posX ] = floatstr( sz_Query ) ;
cache_get_row( idx, 2, sz_Query ), houseInfo[ idx ] [ posY ] = floatstr( sz_Query ) ;
cache_get_row( idx, 3, sz_Query ), houseInfo[ idx ] [ posZ ] = floatstr( sz_Query ) ;
cache_get_row( idx, 4, sz_Query ), houseInfo[ idx ] [ Interior ] = strval( sz_Query ) ;
Iter_Add(Houses,Iter_Count(Houses)+1);
}
}
return 1 ;
}
public OnGameModeInit() {
mysql_function_query( connectionHandle, "SELECT * FROM `houses`", true, "HousesCallBack", "" ) ;
return 1 ;
}
public OnGameModeExit() {
Iter_Clear(Houses);
return 1 ;
}
public OnPlayerKeyStateChange( playerid, newkeys, oldkeys ) {
if ( newkeys & KEY_WALK ) {
foreach(new idx:Houses) {
if ( IsPlayerInRangeOfPoint( playerid, 2.0, houseInfo[ idx ] [ posX ], houseInfo[ idx ] [ posY ], houseInfo[ idx ] [ posZ ] ) ) {
SendClientMessage( playerid, -1, "Вы находитесь около дома!" ) ;
}
}
}
return 1 ;
}
/*Комманды. Для примера взял D_CMD http://pawno-info.ru/threads/156358*/
DCMD:createhouse( playerid, params[] ) {
if ( sscanf( params, "i", params[ 0 ] ) ) {
SendClientMessage( playerid, -1, "Использование: /createhouse [ID Интерьера]" ) ;
return 1 ;
}
new
Float: Pos[ 3 ],
house = Iter_Count(Houses),
sz_Str[ 2 ] [ 128 ];
Iter_Add(Houses, Iter_Count(Houses)+1);
GetPlayerPos( playerid, Pos[ 0 ], Pos[ 1 ], Pos[ 2 ] ) ;
houseInfo[ house ] [ posX ] = Pos[ 0 ];
houseInfo[ house ] [ posY ] = Pos[ 1 ];
houseInfo[ house ] [ posZ ] = Pos[ 2 ];
/*
Тут к примеру запрос для записи дома в базу данных MySQL.
Пример запроса:
*/
format( sz_Str[ 0 ], sizeof sz_Str[ 0 ], "INSERT INTO `houses` (ID,posX,posY,posZ,Interior) VALUES ('%i','%f','%f','%f','%i')", house, Pos[ 0 ], Pos[ 1 ], Pos[ 2 ], params[ 0 ] ) ;
MySQL_function_query( connectionHandle, sz_Str[ 0 ], false, "", "" ) ;
format( sz_Str[ 1 ], sizeof sz_Str[ 1 ], "Вы успешно создали дом порядковый номер которого: %i", house ) ;
SendClientMessage( playerid, -1, sz_Str[ 1 ] ) ;
return 1 ;
}
DCMD:removehouse( playerid, params[] ) {
if ( sscanf( params, "i", params[ 0 ] ) ) {
SendClientMessage( playerid, -1, "Использование: /removehouse [ID дома]" ) ;
return 1 ;
}
if ( params[ 0 ] >= Iter_Count(Houses) ) {
SendClientMessage( playerid, -1, "Дом с таким порядковым номером не существует" ) ;
return 1 ;
}
new sz_Str[ 2 ] [ 128 ];
Iter_Remove(Houses,params[ 0 ]);
/*
Тут к примеру запрос для удаления дома из базы данных MySQL.
Пример запроса:
*/
format( sz_Str[ 0 ], sizeof sz_Str[ 0 ], "DELETE FROM `houses` WHERE `ID` LIKE '%d'", params[ 0 ] ) ;
MySQL_function_query( connectionHandle, sz_Str[ 0 ], false, "", "" ) ;
format( sz_Str[ 1 ], sizeof sz_Str[ 1 ], "Вы успешно удалили дом с порядковым номером %i", house ) ;
SendClientMessage( playerid, -1, sz_Str[ 1 ] ) ;
return 1 ;
}
Автор форича: Y_Less
---------- Post added at 23:04 ---------- Previous post was at 22:16 ----------
Обновил. Добавил небольшой пример использования с использованием: D_CMD, sscanf2, MySQL r7
Последнее редактирование модератором:
