mirror of
				https://github.com/KevinMidboe/linguist.git
				synced 2025-10-29 17:50:22 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			385 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			385 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
/*
 | 
						|
    Originally from /Source/gg2/Scripts/GameServer/processClientCommands.gml in Gang Garrison 2
 | 
						|
 | 
						|
    Copyright (C) 2008-2013 Faucet Software
 | 
						|
    http://www.ganggarrison.com
 | 
						|
 | 
						|
    This program is free software; 
 | 
						|
    you can redistribute it and/or modify it under the terms of the GNU General Public License
 | 
						|
    as published by the Free Software Foundation; either version 3 of the License, or (at your option)
 | 
						|
    any later version.
 | 
						|
    This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; 
 | 
						|
    without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 
 | 
						|
    See the GNU General Public License for more details.
 | 
						|
    You should have received a copy of the GNU General Public License along with this program; if not,
 | 
						|
    see <http://www.gnu.org/licenses>.
 | 
						|
 | 
						|
    Additional permission under GNU GPL version 3 section 7
 | 
						|
    If you modify this Program, or any covered work, by linking or combining it with the Game Maker runtime library, 
 | 
						|
    the 39dll library/extension, Hobbel's Download Manager DLL, or modified versions of these libraries,
 | 
						|
    the licensors of this Program grant you additional permission to convey the resulting work.
 | 
						|
*/
 | 
						|
 | 
						|
var player, playerId, commandLimitRemaining;
 | 
						|
 | 
						|
player = argument0;
 | 
						|
playerId = argument1;
 | 
						|
 | 
						|
// To prevent players from flooding the server, limit the number of commands to process per step and player.
 | 
						|
commandLimitRemaining = 10;
 | 
						|
 | 
						|
with(player) {
 | 
						|
    if(!variable_local_exists("commandReceiveState")) {
 | 
						|
        // 0: waiting for command byte.
 | 
						|
        // 1: waiting for command data length (1 byte)
 | 
						|
        // 2: waiting for command data.
 | 
						|
        commandReceiveState = 0;
 | 
						|
        commandReceiveExpectedBytes = 1;
 | 
						|
        commandReceiveCommand = 0;
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
while(commandLimitRemaining > 0) {
 | 
						|
    var socket;
 | 
						|
    socket = player.socket;
 | 
						|
    if(!tcp_receive(socket, player.commandReceiveExpectedBytes)) {
 | 
						|
        return 0;
 | 
						|
    }
 | 
						|
    
 | 
						|
    switch(player.commandReceiveState)
 | 
						|
    {
 | 
						|
    case 0:
 | 
						|
        player.commandReceiveCommand = read_ubyte(socket);
 | 
						|
        switch(commandBytes[player.commandReceiveCommand]) {
 | 
						|
        case commandBytesInvalidCommand:
 | 
						|
            // Invalid byte received. Wait for another command byte.
 | 
						|
            break;
 | 
						|
            
 | 
						|
        case commandBytesPrefixLength1:
 | 
						|
            player.commandReceiveState = 1;
 | 
						|
            player.commandReceiveExpectedBytes = 1;
 | 
						|
            break;
 | 
						|
 | 
						|
        case commandBytesPrefixLength2:
 | 
						|
            player.commandReceiveState = 3;
 | 
						|
            player.commandReceiveExpectedBytes = 2;
 | 
						|
            break;
 | 
						|
 | 
						|
        default:
 | 
						|
            player.commandReceiveState = 2;
 | 
						|
            player.commandReceiveExpectedBytes = commandBytes[player.commandReceiveCommand];
 | 
						|
            break;
 | 
						|
        }
 | 
						|
        break;
 | 
						|
        
 | 
						|
    case 1:
 | 
						|
        player.commandReceiveState = 2;
 | 
						|
        player.commandReceiveExpectedBytes = read_ubyte(socket);
 | 
						|
        break;
 | 
						|
 | 
						|
    case 3:
 | 
						|
        player.commandReceiveState = 2;
 | 
						|
        player.commandReceiveExpectedBytes = read_ushort(socket);
 | 
						|
        break;
 | 
						|
        
 | 
						|
    case 2:
 | 
						|
        player.commandReceiveState = 0;
 | 
						|
        player.commandReceiveExpectedBytes = 1;
 | 
						|
        commandLimitRemaining -= 1;
 | 
						|
        
 | 
						|
        switch(player.commandReceiveCommand)
 | 
						|
        {
 | 
						|
        case PLAYER_LEAVE:
 | 
						|
            socket_destroy(player.socket);
 | 
						|
            player.socket = -1;
 | 
						|
            break;
 | 
						|
            
 | 
						|
        case PLAYER_CHANGECLASS:
 | 
						|
            var class;
 | 
						|
            class = read_ubyte(socket);
 | 
						|
            if(getCharacterObject(player.team, class) != -1)
 | 
						|
            {
 | 
						|
                if(player.object != -1)
 | 
						|
                {
 | 
						|
                    with(player.object)
 | 
						|
                    {
 | 
						|
                        if (collision_point(x,y,SpawnRoom,0,0) < 0)
 | 
						|
                        {
 | 
						|
                            if (!instance_exists(lastDamageDealer) || lastDamageDealer == player)
 | 
						|
                            {
 | 
						|
                                sendEventPlayerDeath(player, player, noone, BID_FAREWELL);
 | 
						|
                                doEventPlayerDeath(player, player, noone, BID_FAREWELL);
 | 
						|
                            }
 | 
						|
                            else
 | 
						|
                            {
 | 
						|
                                var assistant;
 | 
						|
                                assistant = secondToLastDamageDealer;
 | 
						|
                                if (lastDamageDealer.object)
 | 
						|
                                    if (lastDamageDealer.object.healer)
 | 
						|
                                        assistant = lastDamageDealer.object.healer;
 | 
						|
                                sendEventPlayerDeath(player, lastDamageDealer, assistant, FINISHED_OFF);
 | 
						|
                                doEventPlayerDeath(player, lastDamageDealer, assistant, FINISHED_OFF);
 | 
						|
                            }
 | 
						|
                        }
 | 
						|
                        else 
 | 
						|
                        instance_destroy(); 
 | 
						|
                        
 | 
						|
                    }
 | 
						|
                }
 | 
						|
                else if(player.alarm[5]<=0)
 | 
						|
                    player.alarm[5] = 1;
 | 
						|
                class = checkClasslimits(player, player.team, class);
 | 
						|
                player.class = class;
 | 
						|
                ServerPlayerChangeclass(playerId, player.class, global.sendBuffer);
 | 
						|
            }
 | 
						|
            break;
 | 
						|
            
 | 
						|
        case PLAYER_CHANGETEAM:
 | 
						|
            var newTeam, balance, redSuperiority;
 | 
						|
            newTeam = read_ubyte(socket);
 | 
						|
            
 | 
						|
            redSuperiority = 0   //calculate which team is bigger
 | 
						|
            with(Player)
 | 
						|
            {
 | 
						|
                if(team == TEAM_RED)
 | 
						|
                    redSuperiority += 1;
 | 
						|
                else if(team == TEAM_BLUE)
 | 
						|
                    redSuperiority -= 1;
 | 
						|
            }
 | 
						|
            if(redSuperiority > 0)
 | 
						|
                balance = TEAM_RED;
 | 
						|
            else if(redSuperiority < 0)
 | 
						|
                balance = TEAM_BLUE;
 | 
						|
            else
 | 
						|
                balance = -1;
 | 
						|
            
 | 
						|
            if(balance != newTeam)
 | 
						|
            {
 | 
						|
                if(getCharacterObject(newTeam, player.class) != -1 or newTeam==TEAM_SPECTATOR)
 | 
						|
                {  
 | 
						|
                    if(player.object != -1)
 | 
						|
                    {
 | 
						|
                        with(player.object)
 | 
						|
                        {
 | 
						|
                            if (!instance_exists(lastDamageDealer) || lastDamageDealer == player)
 | 
						|
                            {
 | 
						|
                                sendEventPlayerDeath(player, player, noone, BID_FAREWELL);
 | 
						|
                                doEventPlayerDeath(player, player, noone, BID_FAREWELL);
 | 
						|
                            }
 | 
						|
                            else
 | 
						|
                            {
 | 
						|
                                var assistant;
 | 
						|
                                assistant = secondToLastDamageDealer;
 | 
						|
                                if (lastDamageDealer.object)
 | 
						|
                                    if (lastDamageDealer.object.healer)
 | 
						|
                                        assistant = lastDamageDealer.object.healer;
 | 
						|
                                sendEventPlayerDeath(player, lastDamageDealer, assistant, FINISHED_OFF);
 | 
						|
                                doEventPlayerDeath(player, lastDamageDealer, assistant, FINISHED_OFF);
 | 
						|
                            }
 | 
						|
                        }
 | 
						|
                        player.alarm[5] = global.Server_Respawntime;
 | 
						|
                    }
 | 
						|
                    else if(player.alarm[5]<=0)
 | 
						|
                        player.alarm[5] = 1;                    
 | 
						|
                    var newClass;
 | 
						|
                    newClass = checkClasslimits(player, newTeam, player.class);
 | 
						|
                    if newClass != player.class
 | 
						|
                    {
 | 
						|
                        player.class = newClass;
 | 
						|
                        ServerPlayerChangeclass(playerId, player.class, global.sendBuffer);
 | 
						|
                    }
 | 
						|
                    player.team = newTeam;
 | 
						|
                    ServerPlayerChangeteam(playerId, player.team, global.sendBuffer);
 | 
						|
                    ServerBalanceTeams();
 | 
						|
                }
 | 
						|
            }
 | 
						|
            break;                   
 | 
						|
            
 | 
						|
        case CHAT_BUBBLE:
 | 
						|
            var bubbleImage;
 | 
						|
            bubbleImage = read_ubyte(socket);
 | 
						|
            if(global.aFirst) {
 | 
						|
                bubbleImage = 0;
 | 
						|
            }
 | 
						|
            write_ubyte(global.sendBuffer, CHAT_BUBBLE);
 | 
						|
            write_ubyte(global.sendBuffer, playerId);
 | 
						|
            write_ubyte(global.sendBuffer, bubbleImage);
 | 
						|
            
 | 
						|
            setChatBubble(player, bubbleImage);
 | 
						|
            break;
 | 
						|
            
 | 
						|
        case BUILD_SENTRY:
 | 
						|
            if(player.object != -1)
 | 
						|
            {
 | 
						|
                if(player.class == CLASS_ENGINEER
 | 
						|
                        and collision_circle(player.object.x, player.object.y, 50, Sentry, false, true) < 0
 | 
						|
                        and player.object.nutsNBolts == 100
 | 
						|
                        and (collision_point(player.object.x,player.object.y,SpawnRoom,0,0) < 0)
 | 
						|
                        and !player.sentry
 | 
						|
                        and !player.object.onCabinet)
 | 
						|
                {
 | 
						|
                    write_ubyte(global.sendBuffer, BUILD_SENTRY);
 | 
						|
                    write_ubyte(global.sendBuffer, playerId);
 | 
						|
                    write_ushort(global.serializeBuffer, round(player.object.x*5));
 | 
						|
                    write_ushort(global.serializeBuffer, round(player.object.y*5));
 | 
						|
                    write_byte(global.serializeBuffer, player.object.image_xscale);
 | 
						|
                    buildSentry(player, player.object.x, player.object.y, player.object.image_xscale);
 | 
						|
                }
 | 
						|
            }
 | 
						|
            break;                                       
 | 
						|
 | 
						|
        case DESTROY_SENTRY:
 | 
						|
            with(player.sentry)
 | 
						|
                instance_destroy();
 | 
						|
            break;                     
 | 
						|
        
 | 
						|
        case DROP_INTEL:
 | 
						|
            if (player.object != -1)
 | 
						|
            {
 | 
						|
                if (player.object.intel)
 | 
						|
                {
 | 
						|
                    sendEventDropIntel(player);
 | 
						|
                    doEventDropIntel(player);
 | 
						|
                }
 | 
						|
            }
 | 
						|
            break;     
 | 
						|
              
 | 
						|
        case OMNOMNOMNOM:
 | 
						|
            if(player.object != -1) {
 | 
						|
                if(!player.humiliated
 | 
						|
                    and !player.object.taunting
 | 
						|
                    and !player.object.omnomnomnom
 | 
						|
                    and player.object.canEat
 | 
						|
                    and player.class==CLASS_HEAVY)
 | 
						|
                {                            
 | 
						|
                    write_ubyte(global.sendBuffer, OMNOMNOMNOM);
 | 
						|
                    write_ubyte(global.sendBuffer, playerId);
 | 
						|
                    with(player.object)
 | 
						|
                    {
 | 
						|
                        omnomnomnom = true;
 | 
						|
                        if player.team == TEAM_RED {
 | 
						|
                            omnomnomnomindex=0;
 | 
						|
                            omnomnomnomend=31;
 | 
						|
                        } else if player.team==TEAM_BLUE {
 | 
						|
                            omnomnomnomindex=32;
 | 
						|
                            omnomnomnomend=63;
 | 
						|
                        } 
 | 
						|
                        xscale=image_xscale;
 | 
						|
                    }             
 | 
						|
                }
 | 
						|
            }
 | 
						|
            break;
 | 
						|
             
 | 
						|
        case TOGGLE_ZOOM:
 | 
						|
            if player.object != -1 {
 | 
						|
                if player.class == CLASS_SNIPER {
 | 
						|
                    write_ubyte(global.sendBuffer, TOGGLE_ZOOM);
 | 
						|
                    write_ubyte(global.sendBuffer, playerId);
 | 
						|
                    toggleZoom(player.object);
 | 
						|
                }
 | 
						|
            }
 | 
						|
            break;
 | 
						|
                                                      
 | 
						|
        case PLAYER_CHANGENAME:
 | 
						|
            var nameLength;
 | 
						|
            nameLength = socket_receivebuffer_size(socket);
 | 
						|
            if(nameLength > MAX_PLAYERNAME_LENGTH)
 | 
						|
            {
 | 
						|
                write_ubyte(player.socket, KICK);
 | 
						|
                write_ubyte(player.socket, KICK_NAME);
 | 
						|
                socket_destroy(player.socket);
 | 
						|
                player.socket = -1;
 | 
						|
            }
 | 
						|
            else
 | 
						|
            {
 | 
						|
                with(player)
 | 
						|
                {
 | 
						|
                    if(variable_local_exists("lastNamechange")) 
 | 
						|
                        if(current_time - lastNamechange < 1000)
 | 
						|
                            break;
 | 
						|
                    lastNamechange = current_time;
 | 
						|
                    name = read_string(socket, nameLength);
 | 
						|
                    if(string_count("#",name) > 0)
 | 
						|
                    {
 | 
						|
                        name = "I <3 Bacon";
 | 
						|
                    }
 | 
						|
                    write_ubyte(global.sendBuffer, PLAYER_CHANGENAME);
 | 
						|
                    write_ubyte(global.sendBuffer, playerId);
 | 
						|
                    write_ubyte(global.sendBuffer, string_length(name));
 | 
						|
                    write_string(global.sendBuffer, name);
 | 
						|
                }
 | 
						|
            }
 | 
						|
            break;
 | 
						|
            
 | 
						|
        case INPUTSTATE:
 | 
						|
            if(player.object != -1)
 | 
						|
            {
 | 
						|
                with(player.object)
 | 
						|
                {
 | 
						|
                    keyState = read_ubyte(socket);
 | 
						|
                    netAimDirection = read_ushort(socket);
 | 
						|
                    aimDirection = netAimDirection*360/65536;
 | 
						|
                    event_user(1);
 | 
						|
                }
 | 
						|
            }
 | 
						|
            break;
 | 
						|
        
 | 
						|
        case REWARD_REQUEST:
 | 
						|
            player.rewardId = read_string(socket, socket_receivebuffer_size(socket));
 | 
						|
            player.challenge = rewardCreateChallenge();
 | 
						|
            
 | 
						|
            write_ubyte(socket, REWARD_CHALLENGE_CODE);
 | 
						|
            write_binstring(socket, player.challenge);
 | 
						|
            break;
 | 
						|
            
 | 
						|
        case REWARD_CHALLENGE_RESPONSE:
 | 
						|
            var answer, i, authbuffer;
 | 
						|
            answer = read_binstring(socket, 16);
 | 
						|
            
 | 
						|
            with(player)
 | 
						|
                if(variable_local_exists("challenge") and variable_local_exists("rewardId"))
 | 
						|
                    rewardAuthStart(player, answer, challenge, true, rewardId);
 | 
						|
           
 | 
						|
            break;
 | 
						|
 | 
						|
        case PLUGIN_PACKET:
 | 
						|
            var packetID, buf, success;
 | 
						|
 | 
						|
            packetID = read_ubyte(socket);
 | 
						|
            
 | 
						|
            // get packet data
 | 
						|
            buf = buffer_create();
 | 
						|
            write_buffer_part(buf, socket, socket_receivebuffer_size(socket));
 | 
						|
 | 
						|
            // try to enqueue
 | 
						|
            success = _PluginPacketPush(packetID, buf, player);
 | 
						|
            
 | 
						|
            // if it returned false, packetID was invalid
 | 
						|
            if (!success)
 | 
						|
            {
 | 
						|
                // clear up buffer
 | 
						|
                buffer_destroy(buf);
 | 
						|
 | 
						|
                // kick player
 | 
						|
                write_ubyte(player.socket, KICK);
 | 
						|
                write_ubyte(player.socket, KICK_BAD_PLUGIN_PACKET);
 | 
						|
                socket_destroy(player.socket);
 | 
						|
                player.socket = -1;
 | 
						|
            }
 | 
						|
            break;
 | 
						|
            
 | 
						|
        case CLIENT_SETTINGS:
 | 
						|
            var mirror;
 | 
						|
            mirror = read_ubyte(player.socket);
 | 
						|
            player.queueJump = mirror;
 | 
						|
            
 | 
						|
            write_ubyte(global.sendBuffer, CLIENT_SETTINGS);
 | 
						|
            write_ubyte(global.sendBuffer, playerId);
 | 
						|
            write_ubyte(global.sendBuffer, mirror);
 | 
						|
            break;
 | 
						|
        
 | 
						|
        }
 | 
						|
        break;
 | 
						|
    } 
 | 
						|
}
 |