Доступ к готовым решениям

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

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

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

Мануал Система объектов Diamond RP [засветившаяся в обзорах Richi]

Shift.pwn

Изучающий
Пользователь
Регистрация
4 Дек 2016
Сообщения
289
Лучшие ответы
0
Репутация
56

begin software


Всем привет. Думаю многие видели подобные видео Richi на youtube "Мы взломали даймонд" и т.п
Кратко расскажу: они могли передвигать созданные объекты или вращать их, тем самым тролля игроков.
Подобных систем, я думаю, много, но эту систему я считаю оригиналом проекта. Так как взял я ее со старой версии State 99,
немного переписав под новые стандарты.

По поводу оптимизации: код давно валялся на моем компе, сейчас я его не стал как-то особо оптимизировать (лень взяла свое).
По этому не обессудьте. Сама система представляет из себя серию команд

create - создать объект
select - выбрать объект
createp - создать объект и прилепить его на игрока
edit - редактировать объект
move - передвинуть объект на нужные координаты (в основном эту функцию и использовали в видео Richi)
rot - изменить ротацию объекта
write - изменить текст
destroy - удалить объект


PHP:
enum OB_DATA
{
	obModel,
	Float:obX,
	Float:obY,
	Float:obZ,
	Float:obXR,
	Float:obYR,
	Float:obZR,
	obID
}

new gObjects[MAX_OBJECTS][OB_DATA];
PHP:
CMD:create(playerid, params[])
{
	static const
		fmt_str[] = "Вы создали объект [ID: %d] [Слот: %d]";
		
	new
		str[sizeof(fmt_str) + 2 + 2],
		objid,
		slot = GetFreeSlot();
	
	if(sscanf(params, "d", objid))
		return SendClientMessage(playerid, -1, "Используйте /create [id объекта]");
		
	GetPlayerPos(playerid, gObjects[slot][obX], gObjects[slot][obY], gObjects[slot][obZ]);
	gObjects[slot][obID] = CreateObject(objid, gObjects[slot][obX] + 2.0, gObjects[slot][obY], gObjects[slot][obZ], 0.0, 0.0, 0.0);
	gObjects[slot][obModel] = objid;
	gObjects[slot][obX] += + 2.0;
	gObjects[slot][obXR] = gObjects[slot][obYR] = gObjects[slot][obZR] = 0.0;


	format(str, sizeof(str), fmt_str, gObjects[slot][obID], slot);
	SendClientMessage(playerid, -1, str);
	return 1;
}
CMD:edit(playerid, params[])
{
    new
		objid;

	if(sscanf(params, "d", objid))
		return SendClientMessage(playerid, -1, "Используйте /edit [id объекта]");

	EditObject(playerid, objid);
	return 1;
}
CMD:createp(playerid, params[])
{
	new
	    Float:x,
		Float:y,
		Float:z,
		objid,
		slot = GetFreeSlot();

	if(sscanf(params, "d", objid))
		return SendClientMessage(playerid, -1, "Используйте /createp [id объекта]");

	GetPlayerPos(playerid, x, y, z);
	x = x + 2.0;
	gObjects[slot][obModel] = objid;
	gObjects[slot][obX] = x;
	gObjects[slot][obY] = y;
	gObjects[slot][obZ] = z;
	gObjects[slot][obXR] = 0.0;
	gObjects[slot][obYR] = 0.0;
	gObjects[slot][obZR] = 0.0;
	
	new string[45+5+3];
	format(string, sizeof(string), "Вы создали объект на себя [ID: %d] [Слот: %d]", gObjects[slot][obID], slot);
	SendClientMessage(playerid, -1, string);

	RemovePlayerAttachedObject(playerid, 0);
	RemovePlayerAttachedObject(playerid, 1);
	SetPlayerAttachedObject(playerid, slot, objid, 5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0);
	return 1;
}
CMD:destroy(playerid, params[])
{
    new
	    objid;

	if(sscanf(params, "d", objid))
		return SendClientMessage(playerid, -1, "Используйте /destroy [id объекта]");

	if(!gObjects[objid][obModel])
		return SendClientMessage(playerid, -1, "Введите корректный id объекта");
		
	DestroyObject(gObjects[objid][obID]);
	gObjects[objid][obID] = 0;
	gObjects[objid][obModel] = 0;
	
	new string[26+5];
	format(string, sizeof(string), "Объект [ID: %d] был удален", objid);
	SendClientMessage(playerid, -1, string);
	return 1;
}
CMD:select(playerid, params[])
{
    new
	    objid;

	if(sscanf(params, "D", objid))
		return SendClientMessage(playerid, -1, "Используйте /select [id объекта(не обязательно)]");

	if(!objid)
	{
		SelectObject(playerid);
	}
	else
	{
		gSelectedObject[playerid] = objid;
		EditObject(playerid, objid);
	}
	return 1;
}
CMD:move(playerid, params[])
{
	new
	    Float:xo[2],
		Float:yo[2],
		Float:zo[2],
	    objid,
		Float:time,
		slot = -1;

	if(sscanf(params, "dffff", objid, xo[1], yo[1], zo[1], time))
		return SendClientMessage(playerid, -1, "Используйте /move [id объекта] [x] [y] [z] [время передвижения в секундах]");

	GetObjectPos(objid, xo[0], yo[0], zo[0]);
	MoveObject(objid, xo[0] + xo[1], yo[0] + yo[1], zo[0] + zo[1], time);

	for(new i;i<MAX_OBJECTS;i++)
	{
		if(gObjects[i][obID] == objid)
		{
			slot = i;
			break;
		}
	}
	if(slot == -1)
		slot = GetFreeSlot();
		
	gObjects[slot][obX] = xo[0] + xo[1];
	gObjects[slot][obY] = yo[0] + yo[1];
	gObjects[slot][obZ] = zo[0] + zo[1];
	return 1;
}
CMD:rot(playerid, params[])
{
	new
	    Float:xo,
		Float:yo,
		Float:zo,
		Float:rotXo[2],
		Float:rotYo[2],
		Float:rotZo[2],
	    objid,
		Float:time,
		slot = -1;

	if(sscanf(params, "dffff", objid, rotXo[1], rotYo[1], rotZo[1], time))
		return SendClientMessage(playerid, -1, "Используйте /rot [id объекта] [x] [y] [z] [время передвижения в секундах]");

	GetObjectPos(objid, xo, yo, zo);
	GetObjectRot(objid, rotXo[0], rotYo[0], rotZo[0]);
	MoveObject(objid, xo, yo, zo+0.004, 0.005, rotXo[0] + rotXo[1], rotYo[0] + rotYo[1], rotZo[0] + rotZo[1]);

	for(new i;i<MAX_OBJECTS;i++)
	{
		if(gObjects[i][obID] == objid)
		{
			slot = i;
			break;
		}
	}
	if(slot == -1)
		return 0;
		
	gObjects[slot][obXR] = rotXo[0] + rotXo[1];
	gObjects[slot][obYR] = rotYo[0] + rotYo[1];
	gObjects[slot][obZR] = rotZo[0] + rotZo[1];
	return 1;
}
CMD:write(playerid, params[])
{
    new
	    objid,
		text[24],
		size;

	if(sscanf(params, "ds[24]d", objid, text, size))
		return SendClientMessage(playerid, -1, "Используйте /write [id объекта] [текст] [размер]");

	SetObjectMaterialText(objid, text, 0, OBJECT_MATERIAL_SIZE_512x256, "Arial", size, 0, -1, 0xFF000000, OBJECT_MATERIAL_TEXT_ALIGN_CENTER);
	return 1;
}
stock

PHP:
stock GetFreeSlot()
{
	for(new i;i<MAX_OBJECTS;i++)
	{
		if(!gObjects[i][obModel]) return i;
	}
	return -1;
}
public

PHP:
public OnPlayerSelectObject (playerid, type, objectid, modelid, Float:fX, Float:fY, Float:fZ)
{
	if(type == SELECT_OBJECT_GLOBAL_OBJECT)
    {
		gSelectedObject[playerid] = objectid;
        EditObject(playerid, objectid);
    }
	else
    {
		gSelectedObject[playerid] = objectid;
		EditPlayerObject(playerid, objectid);
    }
	return 1;
}
public OnPlayerEditObject(playerid, playerobject, objectid, response, Float:fX, Float:fY, Float:fZ, Float:fRotX, Float:fRotY, Float:fRotZ)
{
	new Float:oldX, Float:oldY, Float:oldZ, Float:oldRotX, Float:oldRotY, Float:oldRotZ;
	GetObjectPos(objectid, oldX, oldY, oldZ);
	GetObjectRot(objectid, oldRotX, oldRotY, oldRotZ);
	if(!playerobject)
	{
	    if(!IsValidObject(objectid)) return 1;
	    SetObjectPos(objectid, fX, fY, fZ);
     	SetObjectRot(objectid, fRotX, fRotY, fRotZ);
	}
	if(response == EDIT_RESPONSE_FINAL)
	{
	    if(!playerobject)
	    {
	        SetObjectPos(objectid, oldX, oldY, oldZ);
	        SetObjectRot(objectid, oldRotX, oldRotY, oldRotZ);
	    }
	    else
	    {
	        SetPlayerObjectPos(playerid, objectid, oldX, oldY, oldZ);
	        SetPlayerObjectRot(playerid, objectid, oldRotX, oldRotY, oldRotZ);
	    }
	}
	if(response == EDIT_RESPONSE_CANCEL)
	{
		if(!playerobject) 
		{
			SetObjectPos(objectid, oldX, oldY, oldZ);
			SetObjectRot(objectid, oldRotX, oldRotY, oldRotZ);
		}
		else
		{
			SetPlayerObjectPos(playerid, objectid, oldX, oldY, oldZ);
			SetPlayerObjectRot(playerid, objectid, oldRotX, oldRotY, oldRotZ);
		}
	}
	return 1;
}
 
Последнее редактирование:
Сверху Снизу