View difference between Paste ID: 2KbrjMSY and C0VEUyCh
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
13
#define CAMUPDATE_INTERPOLATE 3 // Interpolation
14
15
enum E_CAMUPDATE_COORDS
16
{
17
	Float:CAMUPDATE_camPos[3],
18
	Float:CAMUPDATE_camLook[3],
19
	Float:CAMUPDATE_camPosIP[3], // For interpolation (AFTER POS)
20
	Float:CAMUPDATE_camLookIP[3] // For interpolation (AFTER LOOK)
21
}
22
new Float:pUpdateCamCoords[MAX_PLAYERS][E_CAMUPDATE_COORDS]; // Camera coords (pos+lookat)
23
24
/* FUNCTIONS
25
native SetPlayerCamera(playerid, Float:x, Float:y, Float:z, Float:lookx, Float:looky, Float:lookz, bool:camera_interpolate=false);
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
*/
28
29
// Set a player's camera. If camera_interpolate is true the camera will interpolate (NO TIME CONTROL - see InterpolatePlayerCamera)
30
stock SetPlayerCamera(playerid, Float:x, Float:y, Float:z, Float:lookx, Float:looky, Float:lookz, bool:camera_interpolate=false)
31
{
32
	TogglePlayerSpectating(playerid, true);
33
	
34
	if(camera_interpolate == false) pUpdateCam[playerid] = CAMUPDATE_SET;
35
	else pUpdateCam[playerid] = CAMUPDATE_MOVE;
36
	
37
	pUpdateCamCoords[playerid][CAMUPDATE_camPos][0] = x;
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
}
46
47
// Interpolate a player's camera.
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
	TogglePlayerSpectating(playerid, true);
51
	
52
	pUpdateCam[playerid] = CAMUPDATE_INTERPOLATE;
53
	
54
	pUpdateCamCoords[playerid][CAMUPDATE_camPos][0] = startposx;
55
	pUpdateCamCoords[playerid][CAMUPDATE_camPos][1] = startposy;
56
	pUpdateCamCoords[playerid][CAMUPDATE_camPos][2] = startposz;
57
58
	pUpdateCamCoords[playerid][CAMUPDATE_camLook][0] = startlookx;
59
	pUpdateCamCoords[playerid][CAMUPDATE_camLook][1] = startlooky;
60
	pUpdateCamCoords[playerid][CAMUPDATE_camLook][2] = startlookz;
61
	
62
	pUpdateCamCoords[playerid][CAMUPDATE_camPosIP][0] = toposx;
63
	pUpdateCamCoords[playerid][CAMUPDATE_camPosIP][1] = toposy;
64
	pUpdateCamCoords[playerid][CAMUPDATE_camPosIP][2] = toposz;
65
	
66
	pUpdateCamCoords[playerid][CAMUPDATE_camLookIP][0] = tolookx;
67
	pUpdateCamCoords[playerid][CAMUPDATE_camLookIP][1] = tolooky;
68
	pUpdateCamCoords[playerid][CAMUPDATE_camLookIP][2] = tolookz;
69
	
70
	SetPVarInt(playerid, "CAM_IP_TIME", interpolation_time);
71
	return 1;
72
}
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
				DeletePVar(playerid, "CAM_IP_TIME"); // Delete it; no longer needed.
103
			}
104
		}
105
		pUpdateCam[playerid] = 0; // Doesn't need updating anymore
106
	}
107
	
108
	// Hooking
109
    #if defined NOHUDCAM_OnPlayerUpdate
110
        return NOHUDCAM_OnPlayerUpdate(playerid);
111
    #else
112
        return 1;
113
    #endif
114
}
115
#if defined NOHUDCAM_OnPlayerUpdate
116
    forward NOHUDCAM_OnPlayerUpdate(playerid);
117
#endif
118
#if defined _ALS_OnPlayerUpdate
119
    #undef OnPlayerUpdate
120
#else
121
    #define _ALS_OnPlayerUpdate
122
#endif
123
#define OnPlayerUpdate NOHUDCAM_OnPlayerUpdate