Доступ к архиву

Переход в группу "Пользователь"

300.00 ₽
Одноразовый платёж
Быстрый переход в группу "Пользователи", без надобности написания постов и ожидания.

Покупка дает возможность:
Быть полноправным участником форума
Нормальное копирование кода
Создавать темы
Скачивать файлы
Доступ к архиву Pawno-Info

Перевод системы домов и прочих динамических систем на foreach [ALL]

Статус
В этой теме нельзя размещать новые ответы.

Пельмень

Компетентный
Сегодня кароче был классный день. Однако здравствуйте с вами Пельмень. Я бы хотел поделиться с вами небольшим уроком для ускорения итерации разных систем. Хотел бы подчеркнуть, что данный урок будет актуален в основном для динамических систем. В остальных случаях просто нет смысла использовать данную статью.

Итак начнём.

  • Для начала создаём инклюд, код которого мы возьмём . Внимание это эксперементальная версия.
  • Далее создаём переменную.
    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
 
Последнее редактирование модератором:
Статус
В этой теме нельзя размещать новые ответы.
Сверху Снизу