Quote:
Originally Posted by Eoussama
Great stuff, add attached vehicle objects as mentioned by Reyo, It'll be even sicker
|
That is a lot of work.
- design entire editing platform from scratch (there is no native support for editing attached objects)
- save all this data
- text/textures/colors (this gets complicated to work with)
I am not saying it can't be done by any means just the scope is significantly wider compared to what is already present. But I think it is worth it instead of only attaching some faggy neon lights.
Interesting fact.
https://github.com/Pottus/Texture-St...o/vehicles.pwn
I took this system and hacked and sliced it to work as a feature on DayZ (uncompleted) but the concept completely woks. So I would recommend looking through this at how to deal with editing attached vehicle objects. But here a small gift I didn't use this in Texture Studio I created it after and too bad I did otherwise it probably would have been used.
Creates an edit pivot point that you can use to rotate move anything.
Code:
#include <YSI\y_hooks>
enum EDITPOINTDATA
{
pEditObject,
Float:pEditX,
Float:pEditY,
Float:pEditZ,
Float:pEditRX,
Float:pEditRY,
Float:pEditRZ,
Float:pSaveX,
Float:pSaveY,
Float:pSaveZ,
Float:pSaveRX,
Float:pSaveRY,
Float:pSaveRZ,
pEditObjectSel,
pEditCallBack[32],
}
static pEditPoint[MAX_PLAYERS][EDITPOINTDATA];
stock PlayerEditPoint(playerid, Float:x, Float:y, Float:z, Float:rx, Float:ry, Float:rz, callback[], objectid = -1)
{
if(pEditPoint[playerid][pEditObject] > -1)
DestroyDynamicObject(pEditPoint[playerid][pEditObject]);
if(objectid == -1)
{
pEditPoint[playerid][pEditObject] = CreateDynamicObject(1974,
x,
y,
z,
rx,
ry,
rz,
-1, -1, playerid, .priority = 1);
SetDynamicObjectMaterial(pEditPoint[playerid][pEditObject], 0, 10765, "airportgnd_sfse", "white", -256);
format(pEditPoint[playerid][pEditCallBack], 32, "%s", callback);
pEditPoint[playerid][pEditX] = x;
pEditPoint[playerid][pEditY] = y;
pEditPoint[playerid][pEditZ] = z;
pEditPoint[playerid][pEditRX] = rx;
pEditPoint[playerid][pEditRY] = ry;
pEditPoint[playerid][pEditRZ] = rz;
pEditPoint[playerid][pSaveX] = x;
pEditPoint[playerid][pSaveY] = y;
pEditPoint[playerid][pSaveZ] = z;
pEditPoint[playerid][pSaveRX] = rx;
pEditPoint[playerid][pSaveRY] = ry;
pEditPoint[playerid][pSaveRZ] = rz;
Streamer_Update(playerid);
EditDynamicObject(playerid, pEditPoint[playerid][pEditObject]);
}
else
{
pEditPoint[playerid][pEditObjectSel] = objectid;
EditDynamicObject(playerid, pEditPoint[playerid][pEditObjectSel]);
}
return 1;
}
stock DestroyEditPoint(playerid)
{
if(pEditPoint[playerid][pEditObject] != -1)
{
DestroyDynamicObject(pEditPoint[playerid][pEditObject]);
pEditPoint[playerid][pEditObject] = -1;
}
return 1;
}
hook OnGameModeInit()
{
for(new i = 0; i < MAX_PLAYERS; i++)
{
pEditPoint[i][pEditObject] = -1;
pEditPoint[i][pEditObjectSel] = -1;
}
return 1;
}
hook OnFilterScriptInit()
{
for(new i = 0; i < MAX_PLAYERS; i++)
{
pEditPoint[i][pEditObject] = -1;
pEditPoint[i][pEditObjectSel] = -1;
}
return 1;
}
public OnPlayerEditDynamicObject(playerid, objectid, response, Float:x, Float:y, Float:z, Float:rx, Float:ry, Float:rz)
{
if(objectid == pEditPoint[playerid][pEditObject] || objectid == pEditPoint[playerid][pEditObjectSel])
{
if(response == EDIT_RESPONSE_FINAL)
{
if(pEditPoint[playerid][pEditObjectSel])
{
CallLocalFunction(pEditPoint[playerid][pEditCallBack], "iiifffffffff",
playerid, objectid, response,
x,
y,
z,
rx,
ry,
rz,
x - pEditPoint[playerid][pSaveX],
y - pEditPoint[playerid][pSaveY],
z - pEditPoint[playerid][pSaveZ]);
DestroyEditPoint(playerid);
}
else
{
CallLocalFunction(pEditPoint[playerid][pEditCallBack], "iiifffffffff",
playerid, objectid, response,
pEditPoint[playerid][pEditX],
pEditPoint[playerid][pEditY],
pEditPoint[playerid][pEditZ],
pEditPoint[playerid][pEditRX],
pEditPoint[playerid][pEditRY],
pEditPoint[playerid][pEditRZ],
pEditPoint[playerid][pEditX] - pEditPoint[playerid][pSaveX],
pEditPoint[playerid][pEditY] - pEditPoint[playerid][pSaveY],
pEditPoint[playerid][pEditZ] - pEditPoint[playerid][pSaveZ]);
DestroyEditPoint(playerid);
}
}
else if(response == EDIT_RESPONSE_UPDATE)
{
pEditPoint[playerid][pEditX] = x;
pEditPoint[playerid][pEditY] = y;
pEditPoint[playerid][pEditZ] = z;
pEditPoint[playerid][pEditRX] = rx;
pEditPoint[playerid][pEditRY] = ry;
pEditPoint[playerid][pEditRZ] = rz;
CallLocalFunction(pEditPoint[playerid][pEditCallBack], "iiifffffffff",
playerid, objectid, response, x, y, z, rx, ry, rz,
pEditPoint[playerid][pEditX] - pEditPoint[playerid][pSaveX],
pEditPoint[playerid][pEditY] - pEditPoint[playerid][pSaveY],
pEditPoint[playerid][pEditZ] - pEditPoint[playerid][pSaveZ]);
}
else if(response == EDIT_RESPONSE_CANCEL)
{
CallLocalFunction(pEditPoint[playerid][pEditCallBack], "iiifffffffff",
playerid, objectid, response,
pEditPoint[playerid][pSaveX],
pEditPoint[playerid][pSaveY],
pEditPoint[playerid][pSaveZ],
pEditPoint[playerid][pSaveRX],
pEditPoint[playerid][pSaveRY],
pEditPoint[playerid][pSaveRZ],
0.0, 0.0, 0.0);
DestroyEditPoint(playerid);
}
}
return 1;
}
hook OnPlayerDisconnect(playerid, reason)
{
DestroyEditPoint(playerid);
return 1;
}
Self explanatory example.
Code:
stock PlayerEditPoint(playerid, Float:x, Float:y, Float:z, Float:rx, Float:ry, Float:rz, callback[], objectid = -1)
Just take note of the callback parameters. That last values are the offsets relative to where the edit point was started.
Code:
CallLocalFunction(pEditPoint[playerid][pEditCallBack], "iiifffffffff",
playerid, objectid, response, x, y, z, rx, ry, rz,
pEditPoint[playerid][pEditX] - pEditPoint[playerid][pSaveX],
pEditPoint[playerid][pEditY] - pEditPoint[playerid][pSaveY],
pEditPoint[playerid][pEditZ] - pEditPoint[playerid][pSaveZ]);
forward MyCallback(playerid, objectid, response, Float:x, Float:y, Float:z, Float:rx, Float:ry, Float:rz, Float;offx, Float:offy, Float:offz);
public MyCallback(playerid, objectid, response, Float:x, Float:y, Float:z, Float:rx, Float:ry, Float:rz, Float;offx, Float:offy, Float:offz)
I should get around to polishing this as an include sometime