#define OBJECTS_MOVE // Remove this line to ignore processing for moving objects #define MAX_WORLDS (MAX_PLAYERS + 5) // Edit if your mode uses less than 256 Virtual Worlds #define PLAYER_ONLY // Remove if you don't want people to have their own objects #define MAX_DYN_OBJECTS 1024 // Raise or lower depending on preference #define VIEW_DISTANCE 80.0 // Locking distance for objects to be visible #define LOOP_GRANULARITY 5 // Itterations per second of the processing loop #define KEY_UP 65408 #define KEY_DOWN 128 #define KEY_LEFT 65408 #define KEY_RIGHT 128 #define CAM_OFF_X (0.0) #define CAM_OFF_Y (5.0) #define CAM_OFF_Z (45.0) /*#define CAM_SEL_X #define CAM_SEL_Y #define CAM_SEL_Z*/ #define OBJ_OFF_X (0.0) #define OBJ_OFF_Y (25.0) #define OBJ_OFF_Z (5.0) #define PLY_SEL_X (0.0) #define PLY_SEL_Y (-25.0) #define PLY_SEL_Z (5.0) #define GAME_OBJECT_COUNT 18656 #define dcmd(%1,%2) if ((strcmp(cmdtext, "/%1", true, %2 + 1) == 0) && (((cmdtext[%2 + 1] == 0) && (dcmd_%1(playerid, ""))) || ((cmdtext[%2 + 1] == 32) && (dcmd_%1(playerid, cmdtext[%2 + 2]))))) return 1 #include enum { STATE_NOTHING, STATE_PLACING, STATE_SELECTING } #define SCROLL_PERIOD 1000 #define TIMER_TIME 200 #define DELAY_CALLS (SCROLL_PERIOD / TIMER_TIME) // Scroll speed once a second new gPlayerState[MAX_PLAYERS]; new gPlayersObjects[MAX_PLAYERS]; new gModel[MAX_PLAYERS] = {0, ...}; new gPlayerHeight[MAX_PLAYERS]; new Float:gfLastPos[MAX_PLAYERS][4]; new Float:gfCurPos[MAX_PLAYERS][3]; forward EditorLoop(); public OnFilterScriptInit() { InitObjectPool(); SetTimer("EditorLoop", TIMER_TIME, 1); return 1; } public OnPlayerConnect(playerid) { gPlayerState[playerid] = STATE_NOTHING; gModel[playerid] = 0; } public EditorLoop() { static sCalls[MAX_PLAYERS]; static Float:sfObjRot = 0.0; for (new i = 0; i < MAX_PLAYERS; i++) { if (IsPlayerConnected(i)) { if (gPlayerState[i] == STATE_SELECTING) { if (sCalls[i] >= DELAY_CALLS) { if (ProcessSelection(i)) { ResetSelPos(i); } } else { ResetSelPos(i); } SetDynamicObjectRot(gPlayersObjects[i], 0.0, 0.0, sfObjRot); } else if (gPlayerState[i] == STATE_PLACING) { ProcessMovement(i); } sCalls[i] %= DELAY_CALLS; sCalls[i]++; } else { sCalls[i] = DELAY_CALLS; } } sfObjRot += 1.0; // Can't % floats while (sfObjRot >= 360.0) sfObjRot -= 360.0; } dcmd_create(playerid, text[]) { if (gPlayerState[playerid] == STATE_NOTHING) { GetPlayerPos(playerid, gfLastPos[playerid][0], gfLastPos[playerid][1], gfLastPos[playerid][2]); GetPlayerFacingAngle(playerid, gfLastPos[playerid][3]); new model; model = strval(text); if (model) { gModel[playerid] = model; gPlayerState[playerid] = STATE_PLACING; ResetSetPos(playerid); } else { gPlayerState[playerid] = STATE_SELECTING; ResetSelPos(playerid); } } return 1; } public OnPlayerCommandText(playerid, cmdtext[]) { dcmd(create, 6); return 0; } ResetSelPos(playerid) { SetPlayerPos(playerid, PLY_SEL_X, PLY_SEL_Y, PLY_SEL_Z); SetPlayerVirtualWorld(playerid, 1); SetPlayerCameraPos(playerid, PLY_SEL_X + CAM_OFF_X, PLY_SEL_Y + CAM_OFF_Y, PLY_SEL_Z + CAM_OFF_Z); SetPlayerCameraLookAt(playerid, PLY_SEL_X + OBJ_OFF_X, PLY_SEL_Y + OBJ_OFF_Y, PLY_SEL_Z + OBJ_OFF_Z); TogglePlayerControllable(playerid, 0); } ResetSetPos(playerid) { TogglePlayerControllable(playerid, 1); new Float:x, Float:y, Float:z; x = gfLastPos[playerid][0]; y = gfLastPos[playerid][1]; z = gfLastPos[playerid][2]; SetPlayerPos(playerid, x, y, z); SetPlayerVirtualWorld(playerid, playerid + 2); SetPlayerCameraPos(playerid, x + CAM_OFF_X, y + CAM_OFF_Y, z + CAM_OFF_Z); SetPlayerCameraLookAt(playerid, x + OBJ_OFF_X, y + OBJ_OFF_Y, z + OBJ_OFF_Z); gPlayerHeight[playerid] = 0; gPlayersObjects[playerid] = CreatePlayerVWDynamicObject(playerid, playerid + 2, gModel[playerid], x + OBJ_OFF_X, y + OBJ_OFF_Y, z + OBJ_OFF_Z, 0.0, 0.0, 0.0); gfCurPos[playerid][0] = x; gfCurPos[playerid][1] = y; gfCurPos[playerid][2] = z; } ResetPos(playerid) { SetPlayerPos(playerid, gfLastPos[playerid][0], gfLastPos[playerid][1], gfLastPos[playerid][2]); SetPlayerFacingAngle(playerid, gfLastPos[playerid][3]); SetPlayerVirtualWorld(playerid, 0); SetCameraBehindPlayer(playerid); TogglePlayerControllable(playerid, 1); } ProcessMovement(playerid) { new keys, ud, lr; GetPlayerKeys(playerid, keys, ud, lr); new Float:mod = 1.0; if (keys & KEY_CROUCH) { gPlayerState[playerid] = STATE_NOTHING; // Globalise the object AddAllPlayersToObject(gPlayersObjects[playerid]); AddAllVWToObject(gPlayersObjects[playerid]); gPlayersObjects[playerid] = NO_OBJECT; ResetPos(playerid); return 0; } else if (keys & KEY_JUMP) { gPlayerState[playerid] = STATE_NOTHING; DestroyDynamicObject(gPlayersObjects[playerid]); ResetPos(playerid); return 0; } else if (keys & KEY_SPRINT) { mod = 100.0; } new Float:x, Float:y, Float:z; x = gfCurPos[playerid][0]; y = gfCurPos[playerid][1]; z = gfCurPos[playerid][2]; if (ud == KEY_UP) { y += mod; } else if (ud == KEY_DOWN) { y -= mod; } if (lr == KEY_RIGHT) { x += mod; } else if (lr == KEY_LEFT) { x -= mod; } SetPlayerPos(playerid, x, y, z); SetPlayerCameraPos(playerid, x + CAM_OFF_X, y + CAM_OFF_Y, z + (CAM_OFF_Z + gPlayerHeight[playerid])); SetPlayerCameraLookAt(playerid, x + OBJ_OFF_X, y + OBJ_OFF_Y, z + (OBJ_OFF_Z + gPlayerHeight[playerid])); SetDynamicObjectPos(gPlayersObjects[playerid], x + OBJ_OFF_X, y + OBJ_OFF_Y, z + (OBJ_OFF_Z + gPlayerHeight[playerid])); gfCurPos[playerid][0] = x; gfCurPos[playerid][1] = y; gfCurPos[playerid][2] = z; return 1; } ProcessSelection(playerid) { new keys, ud, lr; GetPlayerKeys(playerid, keys, ud, lr); new temp = gModel[playerid]; if (!temp) { do { gModel[playerid]++; gModel[playerid] %= GAME_OBJECT_COUNT; } while (!IsValidModel(gModel[playerid])); } if (keys & KEY_CROUCH) { gPlayerState[playerid] = STATE_PLACING; DestroyDynamicObject(gPlayersObjects[playerid]); ResetSetPos(playerid); return 0; } else if (keys & KEY_JUMP) { gPlayerState[playerid] = STATE_NOTHING; DestroyDynamicObject(gPlayersObjects[playerid]); ResetPos(playerid); return 0; } if (ud == KEY_UP) { gModel[playerid] += 100; gModel[playerid] %= GAME_OBJECT_COUNT; while (!IsValidModel(gModel[playerid])) { gModel[playerid]++; gModel[playerid] %= GAME_OBJECT_COUNT; } } else if (ud == KEY_DOWN) { gModel[playerid] -= 100; gModel[playerid] %= GAME_OBJECT_COUNT; while (!IsValidModel(gModel[playerid])) { gModel[playerid]--; gModel[playerid] %= GAME_OBJECT_COUNT; } } if (lr == KEY_RIGHT) { do { gModel[playerid]++; gModel[playerid] %= GAME_OBJECT_COUNT; } while (!IsValidModel(gModel[playerid])); } else if (lr == KEY_LEFT) { do { gModel[playerid]--; gModel[playerid] %= GAME_OBJECT_COUNT; } while (!IsValidModel(gModel[playerid])); } if (!temp || temp != gModel[playerid]) { DestroyDynamicObject(gPlayersObjects[playerid]); gPlayersObjects[playerid] = CreatePlayerVWDynamicObject(playerid, 1, gModel[playerid], PLY_SEL_X + OBJ_OFF_X, PLY_SEL_Y + OBJ_OFF_Y, PLY_SEL_Z + OBJ_OFF_Z, 0.0, 0.0, 0.0); } return 1; }