View difference between Paste ID: C0VEUyCh and WL2HYwZ0
SHOW: | | - or go back to the newest paste.
1
/*
2-
MP2's camera system (hud-less)
2+
SetPlayerCamera function by MP2
3-
© MP2 2012
3+
4
Set a player's camera WITHOUT THE HUD!
5
Works by putting players in to spectate mode then setting the camera on the
6
next OnPlayerUpdate call.
7-
native SetPlayerCamera(playerid, Float:x, Float:y, Float:z, Float:x2, Float:y2, Float:z2, sets=5);
7+
8
9
new pUpdateCam[MAX_PLAYERS]; // Cam needs setting? See defines below
10-
enum E_OPU_CAM_DATA
10+
#define CAMUPDATE_NONE 0
11
#define CAMUPDATE_SET 1 // Just set the camera
12-
	Float:opu_cam_pos[3],
12+
#define CAMUPDATE_MOVE 2 // 'CAMERA_MOVE' in SetPlayerCameraLookAt
13-
	Float:opu_cam_look[3],
13+
#define CAMUPDATE_INTERPOLATE 3 // Interpolation
14-
	opu_cam_updates
14+
15
enum E_CAMUPDATE_COORDS
16
{
17-
new OPU_CAM_DATA[MAX_PLAYERS][E_OPU_CAM_DATA];
17+
	Float:CAMUPDATE_camPos[3],
18
	Float:CAMUPDATE_camLook[3],
19
	Float:CAMUPDATE_camPosIP[3], // For interpolation (AFTER POS)
20-
{   
20+
	Float:CAMUPDATE_camLookIP[3] // For interpolation (AFTER LOOK)
21-
    // OPU Cameras
21+
22-
    if(OPU_CAM_DATA[playerid][opu_cam_updates] != 0) // Still updates to process
22+
new Float:pUpdateCamCoords[MAX_PLAYERS][E_CAMUPDATE_COORDS]; // Camera coords (pos+lookat)
23-
    {
23+
24-
		// Set the camera's position
24+
/* FUNCTIONS
25-
        SetPlayerCameraPos(playerid,
25+
native SetPlayerCamera(playerid, Float:x, Float:y, Float:z, Float:lookx, Float:looky, Float:lookz, bool:camera_interpolate=false);
26-
		OPU_CAM_DATA[playerid][opu_cam_pos][0],
26+
native InterpolatePlayerCamera(playerid, Float:startposx, Float:startposy, Float:startposz, Float:startlookx, Float:startlooky, Float:startlookz, Float:toposx, Float:toposy, Float:toposz, Float:tolookx, Float:tolooky, Float:tolookz, interpolation_time=3000);
27-
		OPU_CAM_DATA[playerid][opu_cam_pos][1],
27+
28-
		OPU_CAM_DATA[playerid][opu_cam_pos][2]);
28+
29-
		
29+
// Set a player's camera. If camera_interpolate is true the camera will interpolate (NO TIME CONTROL - see InterpolatePlayerCamera)
30-
		// Set the camera's 'lookat' point
30+
stock SetPlayerCamera(playerid, Float:x, Float:y, Float:z, Float:lookx, Float:looky, Float:lookz, bool:camera_interpolate=false)
31-
        SetPlayerCameraLookAt(playerid,
31+
32-
		OPU_CAM_DATA[playerid][opu_cam_look][0],
32+
33-
		OPU_CAM_DATA[playerid][opu_cam_look][1],
33+
	
34-
		OPU_CAM_DATA[playerid][opu_cam_look][2]);
34+
	if(camera_interpolate == false) pUpdateCam[playerid] = CAMUPDATE_SET;
35
	else pUpdateCam[playerid] = CAMUPDATE_MOVE;
36-
        OPU_CAM_DATA[playerid][opu_cam_updates]--; // We've processed one update
36+
	
37-
    }
37+
	pUpdateCamCoords[playerid][CAMUPDATE_camPos][0] = x;
38-
	return CallLocalFunction("cam_OnPlayerUpdate", "i", playerid); // Hooking method
38+
	pUpdateCamCoords[playerid][CAMUPDATE_camPos][1] = y;
39
	pUpdateCamCoords[playerid][CAMUPDATE_camPos][2] = z;
40
41
	pUpdateCamCoords[playerid][CAMUPDATE_camLook][0] = lookx;
42
	pUpdateCamCoords[playerid][CAMUPDATE_camLook][1] = looky;
43
	pUpdateCamCoords[playerid][CAMUPDATE_camLook][2] = lookz;
44
	return 1;
45-
#define OnPlayerUpdate cam_OnPlayerUpdate
45+
46-
forward cam_OnPlayerUpdate(playerid);
46+
47
// Interpolate a player's camera.
48-
stock SetPlayerCamera(playerid, Float:x, Float:y, Float:z, Float:x2, Float:y2, Float:z2, sets=5)
48+
stock InterpolatePlayerCamera(playerid, Float:startposx, Float:startposy, Float:startposz, Float:startlookx, Float:startlooky, Float:startlookz, Float:toposx, Float:toposy, Float:toposz, Float:tolookx, Float:tolooky, Float:tolookz, interpolation_time=3000)
49
{
50-
	OPU_CAM_DATA[playerid][opu_cam_updates] = sets;
50+
51
	
52-
	OPU_CAM_DATA[playerid][opu_cam_pos][0] = x;
52+
	pUpdateCam[playerid] = CAMUPDATE_INTERPOLATE;
53-
	OPU_CAM_DATA[playerid][opu_cam_pos][1] = y;
53+
	
54-
	OPU_CAM_DATA[playerid][opu_cam_pos][2] = z;
54+
	pUpdateCamCoords[playerid][CAMUPDATE_camPos][0] = startposx;
55-
	OPU_CAM_DATA[playerid][opu_cam_look][0] = x2;
55+
	pUpdateCamCoords[playerid][CAMUPDATE_camPos][1] = startposy;
56-
	OPU_CAM_DATA[playerid][opu_cam_look][1] = y2;
56+
	pUpdateCamCoords[playerid][CAMUPDATE_camPos][2] = startposz;
57-
	OPU_CAM_DATA[playerid][opu_cam_look][2] = z2;
57+
58
	pUpdateCamCoords[playerid][CAMUPDATE_camLook][0] = startlookx;
59
	pUpdateCamCoords[playerid][CAMUPDATE_camLook][1] = startlooky;
60
	pUpdateCamCoords[playerid][CAMUPDATE_camLook][2] = startlookz;
61-
stock x_SetCameraBehindPlayer(playerid)
61+
	
62
	pUpdateCamCoords[playerid][CAMUPDATE_camPosIP][0] = toposx;
63-
	OPU_CAM_DATA[playerid][opu_cam_updates] = 0;
63+
	pUpdateCamCoords[playerid][CAMUPDATE_camPosIP][1] = toposy;
64-
	SetCameraBehindPlayer(playerid);
64+
	pUpdateCamCoords[playerid][CAMUPDATE_camPosIP][2] = toposz;
65
	
66
	pUpdateCamCoords[playerid][CAMUPDATE_camLookIP][0] = tolookx;
67
	pUpdateCamCoords[playerid][CAMUPDATE_camLookIP][1] = tolooky;
68-
#if defined _ALS_SetCameraBehindPlayer
68+
	pUpdateCamCoords[playerid][CAMUPDATE_camLookIP][2] = tolookz;
69-
	#undef SetCameraBehindPlayer
69+
	
70
	SetPVarInt(playerid, "CAM_IP_TIME", interpolation_time);
71-
	#define _ALS_SetCameraBehindPlayer
71+
72
}
73-
#define SetCameraBehindPlayer x_SetCameraBehindPlayer
73+
74
public OnPlayerUpdate(playerid)
75
{
76
	if(pUpdateCam[playerid] != 0) // If camera needs setting, let's do it
77
	{
78
		switch(pUpdateCam[playerid])
79
		{
80
			case CAMUPDATE_SET:
81
			{
82
				SetPlayerCameraPos(playerid, pUpdateCamCoords[playerid][CAMUPDATE_camPos][0], pUpdateCamCoords[playerid][CAMUPDATE_camPos][1], pUpdateCamCoords[playerid][CAMUPDATE_camPos][2]);
83
				SetPlayerCameraLookAt(playerid, pUpdateCamCoords[playerid][CAMUPDATE_camLook][0], pUpdateCamCoords[playerid][CAMUPDATE_camLook][1], pUpdateCamCoords[playerid][CAMUPDATE_camLook][2]);
84
			}
85
			case CAMUPDATE_MOVE:
86
			{
87
				SetPlayerCameraPos(playerid, pUpdateCamCoords[playerid][CAMUPDATE_camPos][0], pUpdateCamCoords[playerid][CAMUPDATE_camPos][1], pUpdateCamCoords[playerid][CAMUPDATE_camPos][2]);
88
				SetPlayerCameraLookAt(playerid, pUpdateCamCoords[playerid][CAMUPDATE_camLook][0], pUpdateCamCoords[playerid][CAMUPDATE_camLook][1], pUpdateCamCoords[playerid][CAMUPDATE_camLook][2], CAMERA_MOVE);
89
			}
90
			case CAMUPDATE_INTERPOLATE:
91
			{
92
				InterpolateCameraPos(playerid,
93
				pUpdateCamCoords[playerid][CAMUPDATE_camPos][0], pUpdateCamCoords[playerid][CAMUPDATE_camPos][1], pUpdateCamCoords[playerid][CAMUPDATE_camPos][2],
94
				pUpdateCamCoords[playerid][CAMUPDATE_camPosIP][0], pUpdateCamCoords[playerid][CAMUPDATE_camPosIP][1], pUpdateCamCoords[playerid][CAMUPDATE_camPosIP][2],
95
				GetPVarInt(playerid, "CAM_IP_TIME"), CAMERA_MOVE);
96
97
				InterpolateCameraLookAt(playerid,
98
				pUpdateCamCoords[playerid][CAMUPDATE_camLook][0], pUpdateCamCoords[playerid][CAMUPDATE_camLook][1], pUpdateCamCoords[playerid][CAMUPDATE_camLook][2],
99
				pUpdateCamCoords[playerid][CAMUPDATE_camLookIP][0], pUpdateCamCoords[playerid][CAMUPDATE_camLookIP][1], pUpdateCamCoords[playerid][CAMUPDATE_camLookIP][2],
100
				GetPVarInt(playerid, "CAM_IP_TIME"), CAMERA_MOVE);
101
			}
102
		}
103
		pUpdateCam[playerid] = 0; // Doesn't need updating anymore
104
	}
105
	
106
	// Hooking
107
    #if defined NOHUDCAM_OnPlayerUpdate
108
        return NOHUDCAM_OnPlayerUpdate(playerid);
109
    #else
110
        return 1;
111
    #endif
112
}
113
#if defined NOHUDCAM_OnPlayerUpdate
114
    forward NOHUDCAM_OnPlayerUpdate(playerid);
115
#endif
116
#if defined _ALS_OnPlayerUpdate
117
    #undef OnPlayerUpdate
118
#else
119
    #define _ALS_OnPlayerUpdate
120
#endif
121
#define OnPlayerUpdate NOHUDCAM_OnPlayerUpdate