- Регистрация
- 4 Дек 2016
- Сообщения
- 289
- Лучшие ответы
- 0
- Репутация
- 56
∞
begin software
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;
}
PHP:
stock GetFreeSlot()
{
for(new i;i<MAX_OBJECTS;i++)
{
if(!gObjects[i][obModel]) return i;
}
return -1;
}
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;
}
Последнее редактирование: