View difference between Paste ID: Qd9HrvGA and 2KbrjMSY
SHOW: | | - or go back to the newest paste.
1
/*
2
SetPlayerCamera function by MP2
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
*/
8
9
new pUpdateCam[MAX_PLAYERS]; // Cam needs setting? See defines below
10
#define CAMUPDATE_NONE 0
11
#define CAMUPDATE_SET 1 // Just set the camera
12-
#define CAMUPDATE_MOVE 2 // 'CAMERA_MOVE' in SetPlayerCameraLookAt
12+
#define CAMUPDATE_MOVE 2 // 'CAMERA_MOVE' in SetPlayerCameraLookAt (reset)
13-
#define CAMUPDATE_INTERPOLATE 3 // Interpolation
13+
#define CAMUPDATE_MOVE2 3 // 'CAMERA_MOVE' in SetPlayerCameraLookAt (move)
14
#define CAMUPDATE_INTERPOLATE 4 // Interpolation
15
16
enum E_CAMUPDATE_COORDS
17
{
18
	Float:CAMUPDATE_camPos[3],
19-
	Float:CAMUPDATE_camPosIP[3], // For interpolation (AFTER POS)
19+
20-
	Float:CAMUPDATE_camLookIP[3] // For interpolation (AFTER LOOK)
20+
	Float:CAMUPDATE_camPosNEW[3], // For interpolation (AFTER POS)
21
	Float:CAMUPDATE_camLookNEW[3] // For interpolation (AFTER LOOK)
22
}
23
new Float:pUpdateCamCoords[MAX_PLAYERS][E_CAMUPDATE_COORDS]; // Camera coords (pos+lookat)
24
25
/* FUNCTIONS
26
native SetPlayerCamera(playerid, Float:x, Float:y, Float:z, Float:lookx, Float:looky, Float:lookz, bool:camera_interpolate=false);
27
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);
28
*/
29
30
// Set a player's camera. If camera_interpolate is true the camera will interpolate (NO TIME CONTROL - see InterpolatePlayerCamera)
31
stock SetPlayerCamera(playerid, Float:x, Float:y, Float:z, Float:lookx, Float:looky, Float:lookz, bool:camera_interpolate=false)
32
{
33
	TogglePlayerSpectating(playerid, true);
34-
	if(camera_interpolate == false) pUpdateCam[playerid] = CAMUPDATE_SET;
34+
35-
	else pUpdateCam[playerid] = CAMUPDATE_MOVE;
35+
	if(camera_interpolate == false) // Just set
36
	{
37-
	pUpdateCamCoords[playerid][CAMUPDATE_camPos][0] = x;
37+
		pUpdateCam[playerid] = CAMUPDATE_SET;
38-
	pUpdateCamCoords[playerid][CAMUPDATE_camPos][1] = y;
38+
		
39-
	pUpdateCamCoords[playerid][CAMUPDATE_camPos][2] = z;
39+
		// Store the new coordinates
40
		pUpdateCamCoords[playerid][CAMUPDATE_camPos][0] = x;
41-
	pUpdateCamCoords[playerid][CAMUPDATE_camLook][0] = lookx;
41+
		pUpdateCamCoords[playerid][CAMUPDATE_camPos][1] = y;
42-
	pUpdateCamCoords[playerid][CAMUPDATE_camLook][1] = looky;
42+
		pUpdateCamCoords[playerid][CAMUPDATE_camPos][2] = z;
43-
	pUpdateCamCoords[playerid][CAMUPDATE_camLook][2] = lookz;
43+
44
		pUpdateCamCoords[playerid][CAMUPDATE_camLook][0] = lookx;
45
		pUpdateCamCoords[playerid][CAMUPDATE_camLook][1] = looky;
46
		pUpdateCamCoords[playerid][CAMUPDATE_camLook][2] = lookz;
47
	}
48
	else // We will need to re-set the camera to where it currently is
49
	{
50
		pUpdateCam[playerid] = CAMUPDATE_MOVE;
51
		new Float:curx, Float:cury, Float:curz; // Cam pos
52
		new Float:curvx, Float:curvy, Float:curvz; // Front vector
53
		GetPlayerCameraPos(playerid, curx, cury, curz);
54
		GetPlayerCameraFrontVector(playerid, curvx, curvy, curvz);
55
		
56
		// NEW coordinates (after setting)
57
		pUpdateCamCoords[playerid][CAMUPDATE_camPosNEW][0] = x;
58
		pUpdateCamCoords[playerid][CAMUPDATE_camPosNEW][1] = y;
59
		pUpdateCamCoords[playerid][CAMUPDATE_camPosNEW][2] = z;
60
61
		pUpdateCamCoords[playerid][CAMUPDATE_camLookNEW][0] = lookx;
62-
	pUpdateCamCoords[playerid][CAMUPDATE_camPosIP][0] = toposx;
62+
		pUpdateCamCoords[playerid][CAMUPDATE_camLookNEW][1] = looky;
63-
	pUpdateCamCoords[playerid][CAMUPDATE_camPosIP][1] = toposy;
63+
		pUpdateCamCoords[playerid][CAMUPDATE_camLookNEW][2] = lookz;
64-
	pUpdateCamCoords[playerid][CAMUPDATE_camPosIP][2] = toposz;
64+
		
65
		// CURRENT coordinates
66-
	pUpdateCamCoords[playerid][CAMUPDATE_camLookIP][0] = tolookx;
66+
		pUpdateCamCoords[playerid][CAMUPDATE_camPos][0] = curx;
67-
	pUpdateCamCoords[playerid][CAMUPDATE_camLookIP][1] = tolooky;
67+
		pUpdateCamCoords[playerid][CAMUPDATE_camPos][1] = cury;
68-
	pUpdateCamCoords[playerid][CAMUPDATE_camLookIP][2] = tolookz;
68+
		pUpdateCamCoords[playerid][CAMUPDATE_camPos][2] = curz;
69
		
70
		curx += curvx;
71
		cury += curvy;
72
		curz += curvz;
73
74
		pUpdateCamCoords[playerid][CAMUPDATE_camLook][0] = curx;
75
		pUpdateCamCoords[playerid][CAMUPDATE_camLook][1] = cury;
76
		pUpdateCamCoords[playerid][CAMUPDATE_camLook][2] = curz;
77
	}
78
	return 1;
79
}
80
81
// Interpolate a player's camera.
82
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)
83
{
84
	TogglePlayerSpectating(playerid, true);
85
	
86
	pUpdateCam[playerid] = CAMUPDATE_INTERPOLATE;
87
	
88-
				SetPlayerCameraLookAt(playerid, pUpdateCamCoords[playerid][CAMUPDATE_camLook][0], pUpdateCamCoords[playerid][CAMUPDATE_camLook][1], pUpdateCamCoords[playerid][CAMUPDATE_camLook][2], CAMERA_MOVE);
88+
89
	pUpdateCamCoords[playerid][CAMUPDATE_camPos][1] = startposy;
90
	pUpdateCamCoords[playerid][CAMUPDATE_camPos][2] = startposz;
91
92
	pUpdateCamCoords[playerid][CAMUPDATE_camLook][0] = startlookx;
93
	pUpdateCamCoords[playerid][CAMUPDATE_camLook][1] = startlooky;
94-
				pUpdateCamCoords[playerid][CAMUPDATE_camPosIP][0], pUpdateCamCoords[playerid][CAMUPDATE_camPosIP][1], pUpdateCamCoords[playerid][CAMUPDATE_camPosIP][2],
94+
95
	
96
	pUpdateCamCoords[playerid][CAMUPDATE_camPosNEW][0] = toposx;
97
	pUpdateCamCoords[playerid][CAMUPDATE_camPosNEW][1] = toposy;
98
	pUpdateCamCoords[playerid][CAMUPDATE_camPosNEW][2] = toposz;
99-
				pUpdateCamCoords[playerid][CAMUPDATE_camLookIP][0], pUpdateCamCoords[playerid][CAMUPDATE_camLookIP][1], pUpdateCamCoords[playerid][CAMUPDATE_camLookIP][2],
99+
100
	pUpdateCamCoords[playerid][CAMUPDATE_camLookNEW][0] = tolookx;
101
	pUpdateCamCoords[playerid][CAMUPDATE_camLookNEW][1] = tolooky;
102
	pUpdateCamCoords[playerid][CAMUPDATE_camLookNEW][2] = tolookz;
103
	
104
	SetPVarInt(playerid, "CAM_IP_TIME", interpolation_time);
105-
		pUpdateCam[playerid] = 0; // Doesn't need updating anymore
105+
106
}
107
108
public OnPlayerUpdate(playerid)
109
{
110
	if(pUpdateCam[playerid] != 0) // If camera needs setting, let's do it
111
	{
112
		switch(pUpdateCam[playerid])
113
		{
114
			case CAMUPDATE_SET:
115
			{
116
				SetPlayerCameraPos(playerid, pUpdateCamCoords[playerid][CAMUPDATE_camPos][0], pUpdateCamCoords[playerid][CAMUPDATE_camPos][1], pUpdateCamCoords[playerid][CAMUPDATE_camPos][2]);
117
				SetPlayerCameraLookAt(playerid, pUpdateCamCoords[playerid][CAMUPDATE_camLook][0], pUpdateCamCoords[playerid][CAMUPDATE_camLook][1], pUpdateCamCoords[playerid][CAMUPDATE_camLook][2]);
118
				
119
				pUpdateCam[playerid] = 0; // Doesn't need updating anymore
120
			}
121
			case CAMUPDATE_MOVE:
122
			{
123
				// Set it back to the old one first
124
				SetPlayerCameraPos(playerid, pUpdateCamCoords[playerid][CAMUPDATE_camPos][0], pUpdateCamCoords[playerid][CAMUPDATE_camPos][1], pUpdateCamCoords[playerid][CAMUPDATE_camPos][2]);
125
				SetPlayerCameraLookAt(playerid, pUpdateCamCoords[playerid][CAMUPDATE_camLook][0], pUpdateCamCoords[playerid][CAMUPDATE_camLook][1], pUpdateCamCoords[playerid][CAMUPDATE_camLook][2]);
126
				
127
				pUpdateCam[playerid] = CAMUPDATE_MOVE2;
128
			}
129
			case CAMUPDATE_MOVE2:
130
			{
131
				// Now move it
132
				SetPlayerCameraPos(playerid, pUpdateCamCoords[playerid][CAMUPDATE_camPosNEW][0], pUpdateCamCoords[playerid][CAMUPDATE_camPosNEW][1], pUpdateCamCoords[playerid][CAMUPDATE_camPosNEW][2]);
133
				SetPlayerCameraLookAt(playerid, pUpdateCamCoords[playerid][CAMUPDATE_camLookNEW][0], pUpdateCamCoords[playerid][CAMUPDATE_camLookNEW][1], pUpdateCamCoords[playerid][CAMUPDATE_camLookNEW][2], CAMERA_MOVE);
134
				
135
				pUpdateCam[playerid] = 0; // Doesn't need updating anymore
136
			}
137
			case CAMUPDATE_INTERPOLATE:
138
			{
139
				InterpolateCameraPos(playerid,
140
				pUpdateCamCoords[playerid][CAMUPDATE_camPos][0], pUpdateCamCoords[playerid][CAMUPDATE_camPos][1], pUpdateCamCoords[playerid][CAMUPDATE_camPos][2],
141
				pUpdateCamCoords[playerid][CAMUPDATE_camPosNEW][0], pUpdateCamCoords[playerid][CAMUPDATE_camPosNEW][1], pUpdateCamCoords[playerid][CAMUPDATE_camPosNEW][2],
142
				GetPVarInt(playerid, "CAM_IP_TIME"), CAMERA_MOVE);
143
144
				InterpolateCameraLookAt(playerid,
145
				pUpdateCamCoords[playerid][CAMUPDATE_camLook][0], pUpdateCamCoords[playerid][CAMUPDATE_camLook][1], pUpdateCamCoords[playerid][CAMUPDATE_camLook][2],
146
				pUpdateCamCoords[playerid][CAMUPDATE_camLookNEW][0], pUpdateCamCoords[playerid][CAMUPDATE_camLookNEW][1], pUpdateCamCoords[playerid][CAMUPDATE_camLookNEW][2],
147
				GetPVarInt(playerid, "CAM_IP_TIME"), CAMERA_MOVE);
148
				
149
				DeletePVar(playerid, "CAM_IP_TIME"); // Delete it; no longer needed.
150
				
151
				pUpdateCam[playerid] = 0; // Doesn't need updating anymore
152
			}
153
		}
154
	}
155
	
156
	// Hooking
157
    #if defined NOHUDCAM_OnPlayerUpdate
158
        return NOHUDCAM_OnPlayerUpdate(playerid);
159
    #else
160
        return 1;
161
    #endif
162
}
163
#if defined NOHUDCAM_OnPlayerUpdate
164
    forward NOHUDCAM_OnPlayerUpdate(playerid);
165
#endif
166
#if defined _ALS_OnPlayerUpdate
167
    #undef OnPlayerUpdate
168
#else
169
    #define _ALS_OnPlayerUpdate
170
#endif
171
#define OnPlayerUpdate NOHUDCAM_OnPlayerUpdate