Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //Einstellungen
- #define MAX_CHARACTER_NAME 50 //Maximale Zeichenanzahl im Namen des Charakters
- #define MAX_CHARACTERS 5 //Maximale Anzahl an Charaktern pro Spieler
- #define MAX_SWITCH_CHARACTER_ANIMATION_HEIGHT 400 //Maximale Höhe der Kamerafahrt
- #define MAX_SWITCH_CHARACTER_ANIMATION_STEP_HEIGHT 4 //Anzahl der Erhöhungen
- //Ab hier nur noch mit Bedacht ändern!
- new Text:switchCharacterGreenScreen;
- //Informationsvariablen
- enum CHARACTER_INFO{
- bool:_inUse = false,
- _characterID,
- _characterName[MAX_CHARACTER_NAME],
- Float:_sX,
- Float:_sY,
- Float:_sZ,
- Float:_sA
- };
- new characters[MAX_PLAYERS][MAX_CHARACTERS][CHARACTER_INFO];
- new cameraUpAmount[MAX_PLAYERS];
- //Prototypes
- forward SwitchCharacterAnimationTimer(playerid, characterID, Float:x, Float:y, Float:z, direction);
- forward OnSwitchComplete(playerid, characterID); //Wird aufgerufen, sobald der Wechsel vollendet wurde und der neue Charakter gespawnt wurde.
- forward OnSwitchUpperMost(playerid, characterID); //Wird aufgerufen, sobald die Kamera beim Switch an der höchsten Position ist - Interessant, um während dem Switch Daten zu laden
- //Funktionen
- /*
- playerid - ID des Spielers, dem ein Charakter hinzugefügt werden soll
- characterName - Name des Charakters
- Float:sX - Spawn Position (X-Koordinate)
- Float:sY - Spawn Position (Y-Koordinate)
- Float:sZ - Spawn Position (Z-Koordinate)
- Float:sA - Ausrichtung des Spielers (Facing Angle)
- return - ID des Charakters
- */
- stock AddCharacter(playerid, characterName[MAX_CHARACTER_NAME], Float:sX, Float:sY, Float:sZ, Float:sA){
- for(new i=0; i<sizeof(characters[]); i++){
- if(!characters[playerid][i][_inUse]){
- format(characters[playerid][i][_characterName], MAX_CHARACTER_NAME, "%s", characterName);
- characters[playerid][i][_sX] = sX;
- characters[playerid][i][_sY] = sY;
- characters[playerid][i][_sZ] = sZ;
- characters[playerid][i][_sA] = sA;
- characters[playerid][i][_characterID] = i+1;
- characters[playerid][i][_inUse] = true;
- return i+1;
- }
- }
- return 0;
- }
- /*
- characterID - ID des Charakters
- result - Call by Reference:Name des Charakters
- return - 1 (wenn Name gefunden / Charakter existiert) / 2 (wenn kein Name gefunden / Charakter existiert nicht)
- */
- stock GetCharacterName(characterID, result[MAX_CHARACTER_NAME]){
- for(new i=0; i<sizeof(characters[]); i++){
- if(characters[playerid][i][_characterID] == characterID){
- format(result, sizeof(result), "%s", characters[playerid][i][_characterName]);
- return 1;
- }
- }
- return 0;
- }
- /*
- characterName - Name des Charakters
- return - ID des Charakters
- */
- stock GetCharacterID(characterName[MAX_CHARACTER_NAME]){
- for(new i=0; i<sizeof(characters[]); i++){
- if(!strcmp(characters[playerid][i][_characterName], characterName)){
- return characters[playerid][i][_characterID];
- }
- }
- return 0;
- }
- /*
- characterID - ID des Charakters
- Float:sX - Call by reference:Spawn des Charakters (X-Koordinate)
- Float:sY - Call by reference:Spawn des Charakters (Y-Koordinate)
- Float:sZ - Call by reference:Spawn des Charakters (Z-Koordinate)
- Float:sA - Call by reference:Ausrichtung des Charakters (Facing Angle)
- return - 1 (wenn Spawn gefunden / Charakter existiert) / 2 (wenn kein Spawn gefunden / Charakter existiert nicht)
- */
- stock GetCharacterSpawn(playerid, characterID, &Float:sX, &Float:sY, &Float:sZ, &Float:sA){
- for(new i=0; i<sizeof(characters[]); i++){
- if(characters[playerid][i][_characterID] == characterID){
- sX = characters[playerid][i][_sX];
- sY = characters[playerid][i][_sY];
- sZ = characters[playerid][i][_sZ];
- sA = characters[playerid][i][_sA];
- return 1;
- }
- }
- return 0;
- }
- /*
- playerid - ID des Spielers, dessen aktueller Charakter abgefragt werden soll
- return - ID des aktuellen Charakters
- */
- stock GetPlayerCharacterID(playerid){
- if(IsPlayerConnected(playerid)) return GetPVarInt(playerid, "characterID");
- return 0;
- }
- /*
- playerid - ID des Spielers, dessen Charaktere ermittelt werden sollen
- result - Call by reference:Variable mit der Größe sizeof(characters[]), in welcher alle ID's gespeichert werden sollen.
- return - Diese Funktion gibt keinen Wert zurück
- */
- stock GetPlayerCharacterList(playerid, result[MAX_CHARACTERS]){
- if(IsPlayerConnected(playerid)){
- for(new i=0; i<sizeof(characters[]); i++){
- if(characters[playerid][i][_characterID] != 0) result[i] = characters[playerid][i][_characterID];
- }
- return 1;
- }else{
- return 0;
- }
- }
- /*
- playerid - ID des Spielers, dessen Charakter gewechselt werden soll
- characterID - ID des Charakters, zu dem gewechselt werden soll
- return - Diese Funktion gibt keinen Wert zurück
- */
- stock SwitchCharacter(playerid, characterID){
- new Float:x, Float:y, Float:z;
- GetPlayerPos(playerid, x, y, z);
- //SetPlayerCameraPos(playerid, x, y, z + 100);
- InterpolateCameraPos(playerid, x, y, z, x, y, z + 100, 500, CAMERA_MOVE);
- InterpolateCameraLookAt(playerid, x, y, z, x, y, z, 500, CAMERA_CUT);
- cameraUpAmount[playerid] = 100;
- switchCharacterGreenScreen = TextDrawCreate(641.500000, 1.500000, "-");
- TextDrawLetterSize(switchCharacterGreenScreen, 0.000000, 49.391975);
- TextDrawTextSize(switchCharacterGreenScreen, -2.000000, 0.000000);
- TextDrawAlignment(switchCharacterGreenScreen, 1);
- TextDrawColor(switchCharacterGreenScreen, 0);
- TextDrawUseBox(switchCharacterGreenScreen, true);
- TextDrawBoxColor(switchCharacterGreenScreen, 16711714);
- TextDrawSetShadow(switchCharacterGreenScreen, 0);
- TextDrawSetOutline(switchCharacterGreenScreen, 0);
- TextDrawBackgroundColor(switchCharacterGreenScreen, 16711714);
- TextDrawFont(switchCharacterGreenScreen, 0);
- TextDrawShowForPlayer(playerid, switchCharacterGreenScreen);
- SetPVarInt(playerid, "switchCharacterAnimationTimerID", SetTimerEx("SwitchCharacterAnimationTimer", 2000, true, "iifffi", playerid, characterID, x, y, z, 1));
- return 1;
- }
- //Timer Funktionen
- public SwitchCharacterAnimationTimer(playerid, characterID, Float:x, Float:y, Float:z, direction){
- new Float:pPos[3], Float:pCamPos[3], Float:characterPos[4];
- GetPlayerCameraPos(playerid, pCamPos[0], pCamPos[1], pCamPos[2]);
- GetCharacterSpawn(playerid, characterID, characterPos[0], characterPos[1], characterPos[2], characterPos[3]);
- GetPlayerPos(playerid, pPos[0], pPos[1], pPos[2]);
- SetPlayerFacingAngle(playerid, characterPos[3]);
- if(direction == 1){
- cameraUpAmount[playerid] += MAX_SWITCH_CHARACTER_ANIMATION_HEIGHT / MAX_SWITCH_CHARACTER_ANIMATION_STEP_HEIGHT;
- SetPlayerCameraPos(playerid, pPos[0], pPos[1], pPos[2] + cameraUpAmount[playerid]);
- SetPlayerCameraLookAt(playerid, pPos[0], pPos[1], pPos[2]);
- if(cameraUpAmount[playerid] == MAX_SWITCH_CHARACTER_ANIMATION_HEIGHT){
- OnSwitchUpperMost(playerid, characterID);
- TogglePlayerSpectating(playerid, true);
- InterpolateCameraPos(playerid, pPos[0], pPos[1], pPos[2] + MAX_SWITCH_CHARACTER_ANIMATION_HEIGHT, characterPos[0], characterPos[1], characterPos[2] + MAX_SWITCH_CHARACTER_ANIMATION_HEIGHT, 2000, CAMERA_MOVE);
- KillTimer(GetPVarInt(playerid, "switchCharacterAnimationTimerID"));
- SetPVarInt(playerid, "switchCharacterAnimationTimerID", SetTimerEx("SwitchCharacterAnimationTimer", 3000, true, "iifffi", playerid, characterID, characterPos[0], characterPos[1], characterPos[2], 2));
- }
- }else if(direction == 2){
- cameraUpAmount[playerid] -= MAX_SWITCH_CHARACTER_ANIMATION_HEIGHT / MAX_SWITCH_CHARACTER_ANIMATION_STEP_HEIGHT;
- if(cameraUpAmount[playerid] != 0){
- SetPlayerCameraPos(playerid, characterPos[0], characterPos[1], characterPos[2] + cameraUpAmount[playerid]);
- SetPlayerCameraLookAt(playerid, characterPos[0], characterPos[1], characterPos[2]);
- }else{
- TogglePlayerSpectating(playerid, false);
- SetPlayerPos(playerid, characterPos[0], characterPos[1], characterPos[2]);
- SetCameraBehindPlayer(playerid);
- KillTimer(GetPVarInt(playerid, "switchCharacterAnimationTimerID"));
- TextDrawDestroy(switchCharacterGreenScreen);
- SetPVarInt(playerid, "characterID", characterID);
- cameraUpAmount[playerid] = 0;
- OnSwitchComplete(playerid, characterID);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement