display 'you are dead message' on death, support speak/text messages in multiprotocol
This commit is contained in:
		
							parent
							
								
									fbaa7c8c43
								
							
						
					
					
						commit
						c7619316bb
					
				| 
						 | 
				
			
			@ -56,10 +56,6 @@ function Game.onConnectionError(message)
 | 
			
		|||
  errorBox.onOk = CharacterList.show
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
function Game.onDeath()
 | 
			
		||||
  print('dead')
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
local function onApplicationClose()
 | 
			
		||||
  print('close app')
 | 
			
		||||
  if Game.isOnline() then
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -4,8 +4,6 @@ TextMessage = {}
 | 
			
		|||
importStyle 'textmessage.otui'
 | 
			
		||||
 | 
			
		||||
-- private variables
 | 
			
		||||
local bottomLabelWidget, centerLabelWidget
 | 
			
		||||
 | 
			
		||||
local MessageTypes = {
 | 
			
		||||
  warning = { color = '#F55E5E', showOnConsole = true, showOnWindow = true, windowLocation = 'CenterLabel' },
 | 
			
		||||
  eventAdvance = { color = '#FFFFFF', showOnConsole = true, showOnWindow = true, windowLocation = 'CenterLabel' },
 | 
			
		||||
| 
						 | 
				
			
			@ -18,37 +16,13 @@ local MessageTypes = {
 | 
			
		|||
  consoleRed = { color = '#F55E5E', showOnConsole = true, showOnWindow = false }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
local MessageTypesMap = {
 | 
			
		||||
  [12] = MessageTypes.consoleOrange,
 | 
			
		||||
  [13] = MessageTypes.consoleOrange,
 | 
			
		||||
  [14] = MessageTypes.warning,
 | 
			
		||||
  [15] = MessageTypes.eventAdvance,
 | 
			
		||||
  [15] = MessageTypes.eventDefault,
 | 
			
		||||
  [16] = MessageTypes.statusDefault,
 | 
			
		||||
  [17] = MessageTypes.infoDesc,
 | 
			
		||||
  [18] = MessageTypes.statusSmall,
 | 
			
		||||
  [19] = MessageTypes.consoleBlue,
 | 
			
		||||
  [20] = MessageTypes.consoleRed,
 | 
			
		||||
--[[
 | 
			
		||||
  [18] = MessageTypes.consoleRed,
 | 
			
		||||
  [19] = MessageTypes.consoleOrange,
 | 
			
		||||
  [20] = MessageTypes.consoleOrange,
 | 
			
		||||
  [21] = MessageTypes.warning,
 | 
			
		||||
  [22] = MessageTypes.eventAdvance,
 | 
			
		||||
  [23] = MessageTypes.eventDefault,
 | 
			
		||||
  [24] = MessageTypes.statusDefault,
 | 
			
		||||
  [25] = MessageTypes.infoDesc,
 | 
			
		||||
  [26] = MessageTypes.statusSmall,
 | 
			
		||||
  [27] = MessageTypes.consoleBlue
 | 
			
		||||
]]--
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
-- private variables
 | 
			
		||||
local bottomLabelWidget
 | 
			
		||||
local centerLabelWidget
 | 
			
		||||
local bottomLabelHideEvent
 | 
			
		||||
local centerLabelHideEvent
 | 
			
		||||
 | 
			
		||||
-- private functions
 | 
			
		||||
local function displayMessage(msgtype, msg)
 | 
			
		||||
local function displayMessage(msgtype, msg, time)
 | 
			
		||||
  if msgtype.showOnConsole then
 | 
			
		||||
    -- TODO
 | 
			
		||||
  end
 | 
			
		||||
| 
						 | 
				
			
			@ -66,7 +40,11 @@ local function displayMessage(msgtype, msg)
 | 
			
		|||
    label:setStyle(msgtype.windowLocation)
 | 
			
		||||
    label:setForegroundColor(msgtype.color)
 | 
			
		||||
 | 
			
		||||
    time = #msg * 75
 | 
			
		||||
    if not time then
 | 
			
		||||
      time = math.max(#msg * 75, 3000)
 | 
			
		||||
    else
 | 
			
		||||
      time = time * 1000
 | 
			
		||||
    end
 | 
			
		||||
    removeEvent(label.hideEvent)
 | 
			
		||||
    label.hideEvent = scheduleEvent(function() label:setVisible(false) end, time)
 | 
			
		||||
  end
 | 
			
		||||
| 
						 | 
				
			
			@ -78,25 +56,33 @@ function TextMessage.create()
 | 
			
		|||
  centerLabelWidget = createWidget('UILabel', Game.gameMapPanel)
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
function TextMessage.displayWarning(msg)
 | 
			
		||||
  TextMessage.display(MessageTypes.warning, msg)
 | 
			
		||||
function TextMessage.displayStatus(msg, time)
 | 
			
		||||
  displayMessage(MessageTypes.warning, msg)
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
function TextMessage.display(msgtypeid, msg)
 | 
			
		||||
  local msgtype = MessageTypesMap[msgtypeid]
 | 
			
		||||
function TextMessage.displayEventAdvance(msg, time)
 | 
			
		||||
  displayMessage(MessageTypes.eventAdvance, msg, time)
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
function TextMessage.display(msgtypedesc, msg)
 | 
			
		||||
  local msgtype = MessageTypes[msgtypedesc]
 | 
			
		||||
  if msgtype == nil then
 | 
			
		||||
    error('unknown text msg type ' .. msgtypeid)
 | 
			
		||||
    error('unknown text msg type ' .. msgtype)
 | 
			
		||||
    return
 | 
			
		||||
  end
 | 
			
		||||
  displayMessage(msgtype, msg)
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
-- hooked events
 | 
			
		||||
function TextMessage.onTextMessage(msgtypeid, msg)
 | 
			
		||||
  TextMessage.display(msgtypeid, msg)
 | 
			
		||||
local function onGameDeath()
 | 
			
		||||
  TextMessage.displayEventAdvance('You are dead.', 10)
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
local function onGameTextMessage(msgtype, msg)
 | 
			
		||||
  TextMessage.display(msgtype, msg)
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
connect(Game, { onLogin = TextMessage.create,
 | 
			
		||||
                onLogout = TextMessage.destroy,
 | 
			
		||||
                onTextMessage = TextMessage.onTextMessage })
 | 
			
		||||
                onDeath = onGameDeath,
 | 
			
		||||
                onTextMessage = onGameTextMessage })
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -39,9 +39,10 @@ FIND_PACKAGE(ZLIB REQUIRED)
 | 
			
		|||
IF(CMAKE_COMPILER_IS_GNUCXX)
 | 
			
		||||
    SET(CXX_WARNS "-Wall -Wextra -Werror -Wno-unused-parameter -Wno-unused-but-set-variable -Wno-unused-variable -Wno-switch -Wno-missing-field-initializers")
 | 
			
		||||
    SET(CMAKE_CXX_FLAGS "-std=gnu++0x -pipe ${CXX_WARNS}")
 | 
			
		||||
    SET(CMAKE_CXX_FLAGS_DEBUG "-O0 -g3 -ggdb3 -fno-inline")
 | 
			
		||||
    SET(CMAKE_CXX_FLAGS_FULLDEBUG "-O0 -g3 -ggdb3 -fno-inline")
 | 
			
		||||
    SET(CMAKE_CXX_FLAGS_DEBUG "-O1 -g -ggdb -fno-inline")
 | 
			
		||||
    SET(CMAKE_CXX_FLAGS_RELEASE "-O2")
 | 
			
		||||
    SET(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O1 -g -ggdb -fno-inline")
 | 
			
		||||
    SET(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O2 -g -ggdb")
 | 
			
		||||
    SET(CMAKE_CXX_LINK_FLAGS "-static-libgcc -static-libstdc++ -Wl,--as-needed")
 | 
			
		||||
ENDIF(CMAKE_COMPILER_IS_GNUCXX)
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -7,6 +7,7 @@ ENDIF(${CMAKE_MAJOR_VERSION} EQUAL 2 AND ${CMAKE_MINOR_VERSION} EQUAL 6)
 | 
			
		|||
OPTION(NO_BOT_PROTECTION "Disables bot protection" OFF)
 | 
			
		||||
SET(PROTOCOL 862 CACHE "Protocol version" STRING)
 | 
			
		||||
ADD_DEFINITIONS(-DPROTOCOL=${PROTOCOL})
 | 
			
		||||
MESSAGE(STATUS "Protocol: " ${PROTOCOL})
 | 
			
		||||
 | 
			
		||||
IF(NO_BOT_PROTECTION)
 | 
			
		||||
    ADD_DEFINITIONS(-DNO_BOT_PROTECTION)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -31,28 +31,6 @@ namespace Otc
 | 
			
		|||
    static const char* AppCompactName = "otclient";
 | 
			
		||||
    static const char* AppVersion = "0.4.0";
 | 
			
		||||
 | 
			
		||||
    static const char* CipsoftPublicRSA = "1321277432058722840622950990822933849527763264961655079678763618"
 | 
			
		||||
                                          "4334395343554449668205332383339435179772895415509701210392836078"
 | 
			
		||||
                                          "6959821132214473291575712138800495033169914814069637740318278150"
 | 
			
		||||
                                          "2907336840325241747827401343576296990629870233111328210165697754"
 | 
			
		||||
                                          "88792221429527047321331896351555606801473202394175817";
 | 
			
		||||
 | 
			
		||||
    static const char* OtservPublicRSA = "1091201329673994292788609605089955415282375029027981291234687579"
 | 
			
		||||
                                         "3726629149257644633073969600111060390723088861007265581882535850"
 | 
			
		||||
                                         "3429057592827629436413108566029093628212635953836686562675849720"
 | 
			
		||||
                                         "6207862794310902180176810615217550567108238764764442605581471797"
 | 
			
		||||
                                         "07119674283982419152118103759076030616683978566631413";
 | 
			
		||||
 | 
			
		||||
    static const int ClientVersion = 862;
 | 
			
		||||
    static const int PicSignature = 0x4E119CBF;
 | 
			
		||||
 | 
			
		||||
    enum OsTypes {
 | 
			
		||||
        OsWindow = 1,
 | 
			
		||||
        OsLinux = 2,
 | 
			
		||||
        OsMac = 3,
 | 
			
		||||
        OsBrowser = 4
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    enum DatOpts {
 | 
			
		||||
        DatGround = 0,
 | 
			
		||||
        DatGroundClip,
 | 
			
		||||
| 
						 | 
				
			
			@ -91,165 +69,6 @@ namespace Otc
 | 
			
		|||
        DatLastOpt = 255
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    enum LoginServerOpts {
 | 
			
		||||
        LoginServerError = 10,
 | 
			
		||||
        LoginServerMotd = 20,
 | 
			
		||||
        LoginServerUpdateNeeded = 30,
 | 
			
		||||
        LoginServerCharacterList = 100
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    enum GameServerOpts {
 | 
			
		||||
        GameServerInitGame = 10,
 | 
			
		||||
        GameServerLoginError = 20,
 | 
			
		||||
        GameServerLoginAdvice = 21,
 | 
			
		||||
        GameServerLoginWait = 22,
 | 
			
		||||
        GameServerPing = 30,
 | 
			
		||||
        GameServerChallange = 31,
 | 
			
		||||
        GameServerDead = 40,
 | 
			
		||||
        GameServerFullMap = 100,
 | 
			
		||||
        GameServerMapTopRow = 101,
 | 
			
		||||
        GameServerMapRightRow = 102,
 | 
			
		||||
        GameServerMapBottomRow = 103,
 | 
			
		||||
        GameServerMapLeftRow = 104,
 | 
			
		||||
        GameServerTileData = 105,
 | 
			
		||||
        GameServerCreateOnMap = 106,
 | 
			
		||||
        GameServerChangeOnMap = 107,
 | 
			
		||||
        GameServerDeleteOnMap = 108,
 | 
			
		||||
        GameServerMoveCreature = 109,
 | 
			
		||||
        GameServerOpenContainer = 110,
 | 
			
		||||
        GameServerCloseContainer = 111,
 | 
			
		||||
        GameServerCreateContainer = 112,
 | 
			
		||||
        GameServerChangeInContainer = 113,
 | 
			
		||||
        GameServerDeleteInContainer = 114,
 | 
			
		||||
        GameServerSetInventory = 120,
 | 
			
		||||
        GameServerDeleteInventory = 121,
 | 
			
		||||
        GameServerNpcOffer = 122,
 | 
			
		||||
        GameServerPlayerGoods = 123,
 | 
			
		||||
        GameServerCloseNpcTrade = 124,
 | 
			
		||||
        GameServerOwnOffer = 125,
 | 
			
		||||
        GameServerCounterOffer = 126,
 | 
			
		||||
        GameServerCloseTrade = 127,
 | 
			
		||||
        GameServerAmbient = 130,
 | 
			
		||||
        GameServerGraphicalEffect = 131,
 | 
			
		||||
        GameServerTextEffect = 132, // absolate in last tibia?
 | 
			
		||||
        GameServerMissleEffect = 133,
 | 
			
		||||
        GameServerMarkCreature = 134,
 | 
			
		||||
        GameServerTrappers = 135,
 | 
			
		||||
        GameServerCreatureHealth = 140,
 | 
			
		||||
        GameServerCreatureLight = 141,
 | 
			
		||||
        GameServerCreatureOutfit = 142,
 | 
			
		||||
        GameServerCreatureSpeed = 143,
 | 
			
		||||
        GameServerCreatureSkull = 144,
 | 
			
		||||
        GameServerCreatureParty = 145,
 | 
			
		||||
        GameServerCreatureUnpass = 146,
 | 
			
		||||
        GameServerEditText = 150,
 | 
			
		||||
        GameServerEditList = 151,
 | 
			
		||||
        GameServerPlayerData = 160,
 | 
			
		||||
        GameServerPlayerSkills = 161,
 | 
			
		||||
        GameServerPlayerState = 162,
 | 
			
		||||
        GameServerClearTarget = 163,
 | 
			
		||||
        GameServerSpellDelay = 164,
 | 
			
		||||
        GameServerSpellGroupDelay = 165,
 | 
			
		||||
        GameServerTalk = 170,
 | 
			
		||||
        GameServerChannels = 171,
 | 
			
		||||
        GameServerOpenChannel = 172,
 | 
			
		||||
        GameServerPrivateChannel = 173,
 | 
			
		||||
        GameServerRuleViolation = 174, // absolate in last tibia?
 | 
			
		||||
        GameServerRuleViolation1 = 175, // absolate in last tibia?
 | 
			
		||||
        GameServerRuleViolation2 = 176, // absolate in last tibia?
 | 
			
		||||
        GameServerRuleViolation3 = 177, // absolate in last tibia?
 | 
			
		||||
        GameServerOpenOwnChannel = 178,
 | 
			
		||||
        GameServerCloseChannel = 179,
 | 
			
		||||
        GameServerMessage = 180,
 | 
			
		||||
        GameServerSnapBack = 181,
 | 
			
		||||
        GameServerWait = 182,
 | 
			
		||||
        GameServerTopFloor = 190,
 | 
			
		||||
        GameServerBottomFloor = 191,
 | 
			
		||||
        GameServerOutfit = 200,
 | 
			
		||||
        GameServerBuddyData = 210,
 | 
			
		||||
        GameServerBuddyLogin = 211,
 | 
			
		||||
        GameServerBuddyLogout = 212,
 | 
			
		||||
        GameServerTutorialHint = 220,
 | 
			
		||||
        GameServerAutomapFlag = 221,
 | 
			
		||||
        GameServerQuestLog = 240,
 | 
			
		||||
        GameServerQuestLine = 241,
 | 
			
		||||
        GameServerChannelEvent = 243,
 | 
			
		||||
        GameServerObjectInfo = 244,
 | 
			
		||||
        GameServerPlayerInventory = 245
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    enum ClientOpts {
 | 
			
		||||
        ClientEnterAccount = 1,
 | 
			
		||||
        ClientEnterGame = 10,
 | 
			
		||||
        ClientQuitGame = 20,
 | 
			
		||||
        ClientPingBack = 30,
 | 
			
		||||
        ClientGoPath = 100,
 | 
			
		||||
        ClientGoNorth = 101,
 | 
			
		||||
        ClientGoEast = 102,
 | 
			
		||||
        ClientGoSouth = 103,
 | 
			
		||||
        ClientGoWest = 104,
 | 
			
		||||
        ClientStop = 105,
 | 
			
		||||
        ClientGoNorthEast = 106,
 | 
			
		||||
        ClientGoSouthEast = 107,
 | 
			
		||||
        ClientGoSouthWest = 108,
 | 
			
		||||
        ClientGoNorthWest = 109,
 | 
			
		||||
        ClientRotateNorth = 111,
 | 
			
		||||
        ClientRotateEast = 112,
 | 
			
		||||
        ClientRotateSouth = 113,
 | 
			
		||||
        ClientRotateWest = 114,
 | 
			
		||||
        ClientEquipObject = 119,
 | 
			
		||||
        ClientMoveObject = 120,
 | 
			
		||||
        ClientInspectNpcTrade = 121,
 | 
			
		||||
        ClientBuyObject = 122,
 | 
			
		||||
        ClientSellObject = 123,
 | 
			
		||||
        ClientCloseNpcTrade = 124,
 | 
			
		||||
        ClientTradeObject = 125,
 | 
			
		||||
        ClientInspectTrade = 126,
 | 
			
		||||
        ClientAcceptTrade = 127,
 | 
			
		||||
        ClientRejectTrade = 128,
 | 
			
		||||
        ClientUseObject = 130,
 | 
			
		||||
        ClientUseTwoObjects = 131,
 | 
			
		||||
        ClientUseOnCreature = 132,
 | 
			
		||||
        ClientTurnObject = 133,
 | 
			
		||||
        ClientCloseContainer = 135,
 | 
			
		||||
        ClientUpContainer = 136,
 | 
			
		||||
        ClientEditText = 137,
 | 
			
		||||
        ClientEditList = 138,
 | 
			
		||||
        ClientLook = 140,
 | 
			
		||||
        ClientTalk = 150,
 | 
			
		||||
        ClientGetChannels = 151,
 | 
			
		||||
        ClientJoinChannel = 152,
 | 
			
		||||
        ClientLeaveChannel = 153,
 | 
			
		||||
        ClientPrivateChannel = 154,
 | 
			
		||||
        ClientCloseNpcChannel = 158,
 | 
			
		||||
        ClientSetTactics = 160,
 | 
			
		||||
        ClientAttack = 161,
 | 
			
		||||
        ClientFollow = 162,
 | 
			
		||||
        ClientInviteToParty = 163,
 | 
			
		||||
        ClientJoinParty = 164,
 | 
			
		||||
        ClientRevokeInvitation = 165,
 | 
			
		||||
        ClientPassLeadership = 166,
 | 
			
		||||
        ClientLeaveParty = 167,
 | 
			
		||||
        ClientShareExperience = 168,
 | 
			
		||||
        ClientDisbandParty = 169,
 | 
			
		||||
        ClientOpenChannel = 170,
 | 
			
		||||
        ClientInviteToChannel = 171,
 | 
			
		||||
        ClientExcludeFromChannel = 172,
 | 
			
		||||
        ClientCancel = 190,
 | 
			
		||||
        ClientRefreshContainer = 202,
 | 
			
		||||
        ClientGetOutfit = 210,
 | 
			
		||||
        ClientSetOutfit = 211,
 | 
			
		||||
        ClientMount = 212,
 | 
			
		||||
        ClientAddBuddy = 220,
 | 
			
		||||
        ClientRemoveBuddy = 221,
 | 
			
		||||
        ClientBugReport = 230,
 | 
			
		||||
        ClientErrorFileEntry = 232,
 | 
			
		||||
        ClientGetQuestLog = 240,
 | 
			
		||||
        ClientGetQuestLine = 241,
 | 
			
		||||
        ClientRuleViolationReport = 242,
 | 
			
		||||
        ClientGetObjectInfo = 243
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    enum InventorySlots {
 | 
			
		||||
        InventorySlotHead = 1,
 | 
			
		||||
        InventorySlotNecklace,
 | 
			
		||||
| 
						 | 
				
			
			@ -332,42 +151,6 @@ namespace Otc
 | 
			
		|||
        FluidCoconutMilk = 15
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    enum SpeakClasses {
 | 
			
		||||
        SpeakSay = 1,             //normal talk
 | 
			
		||||
        SpeakWhisper,             //whispering - #w text
 | 
			
		||||
        SpeakYell,                //yelling - #y text
 | 
			
		||||
        SpeakPrivatePlayerToNpc,  //Player-to-NPC speaking(NPCs channel)
 | 
			
		||||
        SpeakPrivateNpcToPlayer,  //NPC-to-Player speaking
 | 
			
		||||
        SpeakPrivate,             //Players speaking privately to players
 | 
			
		||||
        SpeakChannelYellow,       //Yellow message in chat
 | 
			
		||||
        SpeakChannelWhite,        //White message in chat
 | 
			
		||||
#if PROTOCOL==860
 | 
			
		||||
        SpeakReportChannel,       //Reporting rule violation - Ctrl+R
 | 
			
		||||
        SpeakReportAnswer,        //Answering report
 | 
			
		||||
        SpeakReportContinue,      //Answering the answer of the report
 | 
			
		||||
#endif
 | 
			
		||||
        SpeakBroadcast,           //Broadcast a message - #b
 | 
			
		||||
        SpeakChannelRed,          //Talk red on chat - #c
 | 
			
		||||
        SpeakPrivateRed,          //Red private - @name@ text
 | 
			
		||||
        SpeakChannelOrange,       //Talk orange on text
 | 
			
		||||
#if PROTOCOL==860
 | 
			
		||||
        SpeakUnk1,
 | 
			
		||||
        SpeakChannelRed2,         //Talk red anonymously on chat - #d
 | 
			
		||||
        SpeakUnk2,
 | 
			
		||||
#endif
 | 
			
		||||
        SpeakMonsterSay,          //Talk orange
 | 
			
		||||
        SpeakMonsterYell          //Yell orange
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    enum CreaturesIdRange {
 | 
			
		||||
        PlayerStartId = 0x10000000,
 | 
			
		||||
        PlayerEndId = 0x40000000,
 | 
			
		||||
        MonsterStartId = 0x40000000,
 | 
			
		||||
        MonsterEndId = 0x80000000,
 | 
			
		||||
        NpcStartId = 0x80000000,
 | 
			
		||||
        NpcEndId = 0xffffffff
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    enum FightModes {
 | 
			
		||||
        FightOffensive = 1,
 | 
			
		||||
        FightBalanced = 2,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -24,9 +24,11 @@
 | 
			
		|||
#include "localplayer.h"
 | 
			
		||||
#include "map.h"
 | 
			
		||||
#include "tile.h"
 | 
			
		||||
#include <otclient/net/protocolgame.h>
 | 
			
		||||
#include <framework/core/eventdispatcher.h>
 | 
			
		||||
#include <framework/ui/uimanager.h>
 | 
			
		||||
#include <otclient/luascript/luavaluecasts.h>
 | 
			
		||||
#include <otclient/core/statictext.h>
 | 
			
		||||
#include <otclient/net/protocolgame.h>
 | 
			
		||||
 | 
			
		||||
Game g_game;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -101,7 +103,18 @@ void Game::processDeath()
 | 
			
		|||
    g_dispatcher.scheduleEvent(std::bind(&Game::forceLogout, &g_game), 5 * 1000);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Game::processTextMessage(int type, const std::string& message)
 | 
			
		||||
void Game::processCreatureSpeak(const std::string& name, int level, const std::string& type, const std::string& message, int channelId, const Position& creaturePos)
 | 
			
		||||
{
 | 
			
		||||
    if(creaturePos.isValid()) {
 | 
			
		||||
        StaticTextPtr staticText = StaticTextPtr(new StaticText);
 | 
			
		||||
        staticText->addMessage(name, type, message);
 | 
			
		||||
        g_map.addThing(staticText, creaturePos);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    g_lua.callGlobalField("Game", "onCreatureSpeak", name, level, type, message, channelId, creaturePos);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Game::processTextMessage(const std::string& type, const std::string& message)
 | 
			
		||||
{
 | 
			
		||||
    g_lua.callGlobalField("Game","onTextMessage", type, message);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -45,7 +45,8 @@ public:
 | 
			
		|||
    void processLogout();
 | 
			
		||||
    void processDeath();
 | 
			
		||||
 | 
			
		||||
    void processTextMessage(int type, const std::string& message);
 | 
			
		||||
    void processTextMessage(const std::string& type, const std::string& message);
 | 
			
		||||
    void processCreatureSpeak(const std::string& name, int level, const std::string& type, const std::string& message, int channelId, const Position& creaturePos);
 | 
			
		||||
    void processInventoryChange(int slot, const ItemPtr& item);
 | 
			
		||||
    void processAttackCancel();
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -100,8 +100,7 @@ bool LocalPlayer::canWalk(Otc::Direction direction)
 | 
			
		|||
    Position newPos = m_position + Position::getPosFromDirection(direction);
 | 
			
		||||
    TilePtr tile = g_map.getTile(newPos);
 | 
			
		||||
    if(!tile->isWalkable()) {
 | 
			
		||||
        // TODO: create enum for 17, white message on screen bottom and console.
 | 
			
		||||
        g_game.processTextMessage(17, "Sorry, not possible.");
 | 
			
		||||
        g_game.processTextMessage("statusSmall", "Sorry, not possible.");
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -40,16 +40,16 @@ void StaticText::draw(const Point& p, const Rect& visibleRect)
 | 
			
		|||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool StaticText::addMessage(const std::string& name, int type, const std::string& message)
 | 
			
		||||
bool StaticText::addMessage(const std::string& name, const std::string& type, const std::string& message)
 | 
			
		||||
{
 | 
			
		||||
    // First message
 | 
			
		||||
    if(m_messages.size() == 0) {
 | 
			
		||||
        m_name = name;
 | 
			
		||||
        m_type = type;
 | 
			
		||||
        m_messageType = type;
 | 
			
		||||
    }
 | 
			
		||||
    else {
 | 
			
		||||
        // we can only add another message if it follows these conditions
 | 
			
		||||
        if(m_name != name || m_type != type)
 | 
			
		||||
        if(m_name != name || m_messageType != type)
 | 
			
		||||
            return false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -83,31 +83,31 @@ void StaticText::compose()
 | 
			
		|||
{
 | 
			
		||||
    m_text.clear();
 | 
			
		||||
 | 
			
		||||
    if(m_type == Otc::SpeakSay) {
 | 
			
		||||
    if(m_messageType == "say") {
 | 
			
		||||
        m_text += m_name;
 | 
			
		||||
        m_text += " says:\n";
 | 
			
		||||
        m_color = Color(239, 239, 0);
 | 
			
		||||
    }
 | 
			
		||||
    else if(m_type == Otc::SpeakWhisper) {
 | 
			
		||||
    else if(m_messageType == "whisper") {
 | 
			
		||||
        m_text += m_name;
 | 
			
		||||
        m_text += " whispers:\n";
 | 
			
		||||
        m_color = Color(239, 239, 0);
 | 
			
		||||
    }
 | 
			
		||||
    else if(m_type == Otc::SpeakYell) {
 | 
			
		||||
    else if(m_messageType == "yell") {
 | 
			
		||||
        m_text += m_name;
 | 
			
		||||
        m_text += " yells:\n";
 | 
			
		||||
        m_color = Color(239, 239, 0);
 | 
			
		||||
    }
 | 
			
		||||
    else if(m_type == Otc::SpeakMonsterSay || m_type == Otc::SpeakMonsterYell) {
 | 
			
		||||
    else if(m_messageType == "monsterSay" || m_messageType == "monsterYell") {
 | 
			
		||||
        m_color = Color(254, 101, 0);
 | 
			
		||||
    }
 | 
			
		||||
    else if(m_type == Otc::SpeakPrivateNpcToPlayer) {
 | 
			
		||||
    else if(m_messageType == "npcToPlayer") {
 | 
			
		||||
        m_text += m_name;
 | 
			
		||||
        m_text += " says:\n";
 | 
			
		||||
        m_color = Color(95, 247, 247);
 | 
			
		||||
    }
 | 
			
		||||
    else {
 | 
			
		||||
        logWarning("unknown speak type: ", m_type);
 | 
			
		||||
        logWarning("unknown speak type: ", m_messageType);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Todo: add break lines
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -38,10 +38,10 @@ public:
 | 
			
		|||
    void draw(const Point& p, const Rect& visibleRect);
 | 
			
		||||
 | 
			
		||||
    std::string getName() { return m_name; }
 | 
			
		||||
    int getMessageType() { return m_type; }
 | 
			
		||||
    std::string getMessageType() { return m_messageType; }
 | 
			
		||||
    std::string getFirstMessage() { return m_messages[0]; }
 | 
			
		||||
 | 
			
		||||
    bool addMessage(const std::string& name, int type, const std::string& message);
 | 
			
		||||
    bool addMessage(const std::string& name, const std::string& type, const std::string& message);
 | 
			
		||||
    void removeMessage();
 | 
			
		||||
 | 
			
		||||
    StaticTextPtr asStaticText() { return std::static_pointer_cast<StaticText>(shared_from_this()); }
 | 
			
		||||
| 
						 | 
				
			
			@ -53,7 +53,7 @@ private:
 | 
			
		|||
    Size m_textSize;
 | 
			
		||||
    std::vector<std::string> m_messages;
 | 
			
		||||
    std::string m_name, m_text;
 | 
			
		||||
    int m_type;
 | 
			
		||||
    std::string m_messageType;
 | 
			
		||||
    Color m_color;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -62,6 +62,7 @@ bool luavalue_cast(int index, Outfit& outfit)
 | 
			
		|||
 | 
			
		||||
void push_luavalue(const Position& pos)
 | 
			
		||||
{
 | 
			
		||||
    if(pos.isValid()) {
 | 
			
		||||
        g_lua.newTable();
 | 
			
		||||
        g_lua.pushInteger(pos.x);
 | 
			
		||||
        g_lua.setField("x");
 | 
			
		||||
| 
						 | 
				
			
			@ -69,6 +70,8 @@ void push_luavalue(const Position& pos)
 | 
			
		|||
        g_lua.setField("y");
 | 
			
		||||
        g_lua.pushInteger(pos.z);
 | 
			
		||||
        g_lua.setField("z");
 | 
			
		||||
    } else
 | 
			
		||||
        g_lua.pushNil();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool luavalue_cast(int index, Position& pos)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -25,6 +25,7 @@
 | 
			
		|||
 | 
			
		||||
#include <otclient/global.h>
 | 
			
		||||
#include <framework/net/declarations.h>
 | 
			
		||||
#include "protocolcodes.h"
 | 
			
		||||
 | 
			
		||||
class ProtocolLogin;
 | 
			
		||||
class ProtocolGame;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,355 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright (c) 2010-2012 OTClient <https://github.com/edubart/otclient>
 | 
			
		||||
 *
 | 
			
		||||
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 | 
			
		||||
 * of this software and associated documentation files (the "Software"), to deal
 | 
			
		||||
 * in the Software without restriction, including without limitation the rights
 | 
			
		||||
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 | 
			
		||||
 * copies of the Software, and to permit persons to whom the Software is
 | 
			
		||||
 * furnished to do so, subject to the following conditions:
 | 
			
		||||
 *
 | 
			
		||||
 * The above copyright notice and this permission notice shall be included in
 | 
			
		||||
 * all copies or substantial portions of the Software.
 | 
			
		||||
 *
 | 
			
		||||
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | 
			
		||||
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
			
		||||
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 | 
			
		||||
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | 
			
		||||
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 | 
			
		||||
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 | 
			
		||||
 * THE SOFTWARE.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef PROTOCOLCODES_H
 | 
			
		||||
#define PROTOCOLCODES_H
 | 
			
		||||
 | 
			
		||||
#include <otclient/global.h>
 | 
			
		||||
 | 
			
		||||
#if PROTOCOL != 860 && PROTOCOL != 862
 | 
			
		||||
#error "the supplied protocol version is not supported"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
namespace Proto {
 | 
			
		||||
#ifdef CIPSOFT_RSA
 | 
			
		||||
    static const char* RSA = "1321277432058722840622950990822933849527763264961655079678763618"
 | 
			
		||||
                             "4334395343554449668205332383339435179772895415509701210392836078"
 | 
			
		||||
                             "6959821132214473291575712138800495033169914814069637740318278150"
 | 
			
		||||
                             "2907336840325241747827401343576296990629870233111328210165697754"
 | 
			
		||||
                             "88792221429527047321331896351555606801473202394175817";
 | 
			
		||||
#else
 | 
			
		||||
    static const char* RSA = "1091201329673994292788609605089955415282375029027981291234687579"
 | 
			
		||||
                             "3726629149257644633073969600111060390723088861007265581882535850"
 | 
			
		||||
                             "3429057592827629436413108566029093628212635953836686562675849720"
 | 
			
		||||
                             "6207862794310902180176810615217550567108238764764442605581471797"
 | 
			
		||||
                             "07119674283982419152118103759076030616683978566631413";
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    static const int ClientVersion = PROTOCOL;
 | 
			
		||||
    static const int PicSignature = 0x4E119CBF;
 | 
			
		||||
 | 
			
		||||
    enum OsTypes {
 | 
			
		||||
        OsWindow = 1,
 | 
			
		||||
        OsLinux = 2,
 | 
			
		||||
        OsMac = 3,
 | 
			
		||||
        OsBrowser = 4
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    enum LoginServerOpts {
 | 
			
		||||
        LoginServerError = 10,
 | 
			
		||||
        LoginServerMotd = 20,
 | 
			
		||||
        LoginServerUpdateNeeded = 30,
 | 
			
		||||
        LoginServerCharacterList = 100
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    enum GameServerOpts {
 | 
			
		||||
        GameServerInitGame = 10,
 | 
			
		||||
        GameServerLoginError = 20,
 | 
			
		||||
        GameServerLoginAdvice = 21,
 | 
			
		||||
        GameServerLoginWait = 22,
 | 
			
		||||
        GameServerPing = 30,
 | 
			
		||||
        GameServerChallange = 31,
 | 
			
		||||
        GameServerDead = 40,
 | 
			
		||||
        GameServerFullMap = 100,
 | 
			
		||||
        GameServerMapTopRow = 101,
 | 
			
		||||
        GameServerMapRightRow = 102,
 | 
			
		||||
        GameServerMapBottomRow = 103,
 | 
			
		||||
        GameServerMapLeftRow = 104,
 | 
			
		||||
        GameServerTileData = 105,
 | 
			
		||||
        GameServerCreateOnMap = 106,
 | 
			
		||||
        GameServerChangeOnMap = 107,
 | 
			
		||||
        GameServerDeleteOnMap = 108,
 | 
			
		||||
        GameServerMoveCreature = 109,
 | 
			
		||||
        GameServerOpenContainer = 110,
 | 
			
		||||
        GameServerCloseContainer = 111,
 | 
			
		||||
        GameServerCreateContainer = 112,
 | 
			
		||||
        GameServerChangeInContainer = 113,
 | 
			
		||||
        GameServerDeleteInContainer = 114,
 | 
			
		||||
        GameServerSetInventory = 120,
 | 
			
		||||
        GameServerDeleteInventory = 121,
 | 
			
		||||
        GameServerNpcOffer = 122,
 | 
			
		||||
        GameServerPlayerGoods = 123,
 | 
			
		||||
        GameServerCloseNpcTrade = 124,
 | 
			
		||||
        GameServerOwnOffer = 125,
 | 
			
		||||
        GameServerCounterOffer = 126,
 | 
			
		||||
        GameServerCloseTrade = 127,
 | 
			
		||||
        GameServerAmbient = 130,
 | 
			
		||||
        GameServerGraphicalEffect = 131,
 | 
			
		||||
        GameServerTextEffect = 132, // absolate in last tibia?
 | 
			
		||||
        GameServerMissleEffect = 133,
 | 
			
		||||
        GameServerMarkCreature = 134,
 | 
			
		||||
        GameServerTrappers = 135,
 | 
			
		||||
        GameServerCreatureHealth = 140,
 | 
			
		||||
        GameServerCreatureLight = 141,
 | 
			
		||||
        GameServerCreatureOutfit = 142,
 | 
			
		||||
        GameServerCreatureSpeed = 143,
 | 
			
		||||
        GameServerCreatureSkull = 144,
 | 
			
		||||
        GameServerCreatureParty = 145,
 | 
			
		||||
        GameServerCreatureUnpass = 146,
 | 
			
		||||
        GameServerEditText = 150,
 | 
			
		||||
        GameServerEditList = 151,
 | 
			
		||||
        GameServerPlayerData = 160,
 | 
			
		||||
        GameServerPlayerSkills = 161,
 | 
			
		||||
        GameServerPlayerState = 162,
 | 
			
		||||
        GameServerClearTarget = 163,
 | 
			
		||||
        GameServerSpellDelay = 164,
 | 
			
		||||
        GameServerSpellGroupDelay = 165,
 | 
			
		||||
        GameServerTalk = 170,
 | 
			
		||||
        GameServerChannels = 171,
 | 
			
		||||
        GameServerOpenChannel = 172,
 | 
			
		||||
        GameServerPrivateChannel = 173,
 | 
			
		||||
        GameServerRuleViolation = 174, // absolate in last tibia?
 | 
			
		||||
        GameServerRuleViolation1 = 175, // absolate in last tibia?
 | 
			
		||||
        GameServerRuleViolation2 = 176, // absolate in last tibia?
 | 
			
		||||
        GameServerRuleViolation3 = 177, // absolate in last tibia?
 | 
			
		||||
        GameServerOpenOwnChannel = 178,
 | 
			
		||||
        GameServerCloseChannel = 179,
 | 
			
		||||
        GameServerMessage = 180,
 | 
			
		||||
        GameServerSnapBack = 181,
 | 
			
		||||
        GameServerWait = 182,
 | 
			
		||||
        GameServerTopFloor = 190,
 | 
			
		||||
        GameServerBottomFloor = 191,
 | 
			
		||||
        GameServerOutfit = 200,
 | 
			
		||||
        GameServerBuddyData = 210,
 | 
			
		||||
        GameServerBuddyLogin = 211,
 | 
			
		||||
        GameServerBuddyLogout = 212,
 | 
			
		||||
        GameServerTutorialHint = 220,
 | 
			
		||||
        GameServerAutomapFlag = 221,
 | 
			
		||||
        GameServerQuestLog = 240,
 | 
			
		||||
        GameServerQuestLine = 241,
 | 
			
		||||
        GameServerChannelEvent = 243,
 | 
			
		||||
        GameServerObjectInfo = 244,
 | 
			
		||||
        GameServerPlayerInventory = 245
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    enum ClientOpts {
 | 
			
		||||
        ClientEnterAccount = 1,
 | 
			
		||||
        ClientEnterGame = 10,
 | 
			
		||||
        ClientQuitGame = 20,
 | 
			
		||||
        ClientPingBack = 30,
 | 
			
		||||
        ClientGoPath = 100,
 | 
			
		||||
        ClientGoNorth = 101,
 | 
			
		||||
        ClientGoEast = 102,
 | 
			
		||||
        ClientGoSouth = 103,
 | 
			
		||||
        ClientGoWest = 104,
 | 
			
		||||
        ClientStop = 105,
 | 
			
		||||
        ClientGoNorthEast = 106,
 | 
			
		||||
        ClientGoSouthEast = 107,
 | 
			
		||||
        ClientGoSouthWest = 108,
 | 
			
		||||
        ClientGoNorthWest = 109,
 | 
			
		||||
        ClientRotateNorth = 111,
 | 
			
		||||
        ClientRotateEast = 112,
 | 
			
		||||
        ClientRotateSouth = 113,
 | 
			
		||||
        ClientRotateWest = 114,
 | 
			
		||||
        ClientEquipObject = 119,
 | 
			
		||||
        ClientMoveObject = 120,
 | 
			
		||||
        ClientInspectNpcTrade = 121,
 | 
			
		||||
        ClientBuyObject = 122,
 | 
			
		||||
        ClientSellObject = 123,
 | 
			
		||||
        ClientCloseNpcTrade = 124,
 | 
			
		||||
        ClientTradeObject = 125,
 | 
			
		||||
        ClientInspectTrade = 126,
 | 
			
		||||
        ClientAcceptTrade = 127,
 | 
			
		||||
        ClientRejectTrade = 128,
 | 
			
		||||
        ClientUseObject = 130,
 | 
			
		||||
        ClientUseTwoObjects = 131,
 | 
			
		||||
        ClientUseOnCreature = 132,
 | 
			
		||||
        ClientTurnObject = 133,
 | 
			
		||||
        ClientCloseContainer = 135,
 | 
			
		||||
        ClientUpContainer = 136,
 | 
			
		||||
        ClientEditText = 137,
 | 
			
		||||
        ClientEditList = 138,
 | 
			
		||||
        ClientLook = 140,
 | 
			
		||||
        ClientTalk = 150,
 | 
			
		||||
        ClientGetChannels = 151,
 | 
			
		||||
        ClientJoinChannel = 152,
 | 
			
		||||
        ClientLeaveChannel = 153,
 | 
			
		||||
        ClientPrivateChannel = 154,
 | 
			
		||||
        ClientCloseNpcChannel = 158,
 | 
			
		||||
        ClientSetTactics = 160,
 | 
			
		||||
        ClientAttack = 161,
 | 
			
		||||
        ClientFollow = 162,
 | 
			
		||||
        ClientInviteToParty = 163,
 | 
			
		||||
        ClientJoinParty = 164,
 | 
			
		||||
        ClientRevokeInvitation = 165,
 | 
			
		||||
        ClientPassLeadership = 166,
 | 
			
		||||
        ClientLeaveParty = 167,
 | 
			
		||||
        ClientShareExperience = 168,
 | 
			
		||||
        ClientDisbandParty = 169,
 | 
			
		||||
        ClientOpenChannel = 170,
 | 
			
		||||
        ClientInviteToChannel = 171,
 | 
			
		||||
        ClientExcludeFromChannel = 172,
 | 
			
		||||
        ClientCancel = 190,
 | 
			
		||||
        ClientRefreshContainer = 202,
 | 
			
		||||
        ClientGetOutfit = 210,
 | 
			
		||||
        ClientSetOutfit = 211,
 | 
			
		||||
        ClientMount = 212,
 | 
			
		||||
        ClientAddBuddy = 220,
 | 
			
		||||
        ClientRemoveBuddy = 221,
 | 
			
		||||
        ClientBugReport = 230,
 | 
			
		||||
        ClientErrorFileEntry = 232,
 | 
			
		||||
        ClientGetQuestLog = 240,
 | 
			
		||||
        ClientGetQuestLine = 241,
 | 
			
		||||
        ClientRuleViolationReport = 242,
 | 
			
		||||
        ClientGetObjectInfo = 243
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    enum SpeakTypes {
 | 
			
		||||
#if PROTOCOL==862
 | 
			
		||||
        SpeakSay = 1,
 | 
			
		||||
        SpeakWhisper,
 | 
			
		||||
        SpeakYell,
 | 
			
		||||
        SpeakPrivatePlayerToNpc,
 | 
			
		||||
        SpeakPrivateNpcToPlayer,
 | 
			
		||||
        SpeakPrivate,
 | 
			
		||||
        SpeakChannelYellow,
 | 
			
		||||
        SpeakChannelWhite,
 | 
			
		||||
        SpeakBroadcast,
 | 
			
		||||
        SpeakChannelRed,
 | 
			
		||||
        SpeakPrivateRed,
 | 
			
		||||
        SpeakChannelOrange,
 | 
			
		||||
        SpeakMonsterSay,
 | 
			
		||||
        SpeakMonsterYell
 | 
			
		||||
#elif PROTOCOL==860
 | 
			
		||||
        SpeakSay = 1,
 | 
			
		||||
        SpeakWhisper,
 | 
			
		||||
        SpeakYell,
 | 
			
		||||
        SpeakPrivatePlayerToNpc,
 | 
			
		||||
        SpeakPrivateNpcToPlayer,
 | 
			
		||||
        SpeakPrivate,
 | 
			
		||||
        SpeakChannelYellow,
 | 
			
		||||
        SpeakChannelWhite,
 | 
			
		||||
        SpeakReportChannel,
 | 
			
		||||
        SpeakReportAnswer,
 | 
			
		||||
        SpeakReportContinue,
 | 
			
		||||
        SpeakBroadcast,
 | 
			
		||||
        SpeakChannelRed,
 | 
			
		||||
        SpeakPrivateRed,
 | 
			
		||||
        SpeakChannelOrange,
 | 
			
		||||
        SpeakUnk1,
 | 
			
		||||
        SpeakUnk2,
 | 
			
		||||
        SpeakUnk3,
 | 
			
		||||
        SpeakMonsterSay,
 | 
			
		||||
        SpeakMonsterYell
 | 
			
		||||
#endif
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    enum MessageTypes {
 | 
			
		||||
#if PROTOCOL==860
 | 
			
		||||
        MessageConsoleRed = 18,
 | 
			
		||||
        MessageConsoleOrange1,
 | 
			
		||||
        MessageConsoleOrange2,
 | 
			
		||||
        MessageWarning,
 | 
			
		||||
        MessageEventAdvance,
 | 
			
		||||
        MessageEventDefault,
 | 
			
		||||
        MessageStatusDefault,
 | 
			
		||||
        MessageInfoDescription,
 | 
			
		||||
        MessageStatusSmall,
 | 
			
		||||
        MessageConsoleBlue
 | 
			
		||||
#elif PROTOCOL==862
 | 
			
		||||
        MessageConsoleOrange1 = 12,
 | 
			
		||||
        MessageConsoleOrange2,
 | 
			
		||||
        MessageWarning,
 | 
			
		||||
        MessageEventAdvance,
 | 
			
		||||
        MessageEventDefault,
 | 
			
		||||
        MessageStatusDefault,
 | 
			
		||||
        MessageInfoDescription,
 | 
			
		||||
        MessageStatusSmall,
 | 
			
		||||
        MessageConsoleBlue,
 | 
			
		||||
        MessageConsoleRed
 | 
			
		||||
#endif
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    enum CreaturesIdRange {
 | 
			
		||||
        PlayerStartId = 0x10000000,
 | 
			
		||||
        PlayerEndId = 0x40000000,
 | 
			
		||||
        MonsterStartId = 0x40000000,
 | 
			
		||||
        MonsterEndId = 0x80000000,
 | 
			
		||||
        NpcStartId = 0x80000000,
 | 
			
		||||
        NpcEndId = 0xffffffff
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    inline std::string translateSpeakType(int type) {
 | 
			
		||||
        switch(type) {
 | 
			
		||||
            case Proto::SpeakSay:
 | 
			
		||||
                return "say";
 | 
			
		||||
            case Proto::SpeakWhisper:
 | 
			
		||||
                return "whisper";
 | 
			
		||||
            case Proto::SpeakYell:
 | 
			
		||||
                return "yell";
 | 
			
		||||
            case Proto::SpeakMonsterSay:
 | 
			
		||||
                return  "monsterSay";
 | 
			
		||||
            case Proto::SpeakMonsterYell:
 | 
			
		||||
                return "monsterYell";
 | 
			
		||||
            case Proto::SpeakPrivateNpcToPlayer:
 | 
			
		||||
                return "npcToPlayer";
 | 
			
		||||
                break;
 | 
			
		||||
            case Proto::SpeakChannelYellow:
 | 
			
		||||
                return "channelYellow";
 | 
			
		||||
            case Proto::SpeakChannelWhite:
 | 
			
		||||
                return "channelWhite";
 | 
			
		||||
            case Proto::SpeakChannelRed:
 | 
			
		||||
                return "channelRed";
 | 
			
		||||
            case Proto::SpeakChannelOrange:
 | 
			
		||||
                return "channelOrange";
 | 
			
		||||
            case Proto::SpeakPrivate:
 | 
			
		||||
                return "private";
 | 
			
		||||
            case Proto::SpeakPrivatePlayerToNpc:
 | 
			
		||||
                return "playerToNpc";
 | 
			
		||||
            case Proto::SpeakBroadcast:
 | 
			
		||||
                return "broadcast";
 | 
			
		||||
            case Proto::SpeakPrivateRed:
 | 
			
		||||
                return "privateRed";
 | 
			
		||||
            default:
 | 
			
		||||
                return "unknown";
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    inline std::string translateMessageType(int type) {
 | 
			
		||||
        switch(type) {
 | 
			
		||||
            case Proto::MessageConsoleRed:
 | 
			
		||||
                return "consoleRed";
 | 
			
		||||
            case Proto::MessageConsoleOrange1:
 | 
			
		||||
                return "consoleOrange";
 | 
			
		||||
            case Proto::MessageConsoleOrange2:
 | 
			
		||||
                return "consoleOrange";
 | 
			
		||||
            case Proto::MessageWarning:
 | 
			
		||||
                return "warning";
 | 
			
		||||
            case Proto::MessageEventAdvance:
 | 
			
		||||
                return "eventAdvance";
 | 
			
		||||
            case Proto::MessageEventDefault:
 | 
			
		||||
                return "eventDefault";
 | 
			
		||||
            case Proto::MessageStatusDefault:
 | 
			
		||||
                return "statusDefault";
 | 
			
		||||
            case Proto::MessageInfoDescription:
 | 
			
		||||
                return "infoDescription";
 | 
			
		||||
            case Proto::MessageStatusSmall:
 | 
			
		||||
                return "statusSmall";
 | 
			
		||||
            case Proto::MessageConsoleBlue:
 | 
			
		||||
                return "consoleBlue";
 | 
			
		||||
            default:
 | 
			
		||||
                return "unknown";
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			@ -32,8 +32,6 @@
 | 
			
		|||
#include <otclient/core/tile.h>
 | 
			
		||||
#include <otclient/luascript/luavaluecasts.h>
 | 
			
		||||
#include <framework/core/eventdispatcher.h>
 | 
			
		||||
#include <framework/graphics/particlemanager.h>
 | 
			
		||||
#include <otclient/core/statictext.h>
 | 
			
		||||
 | 
			
		||||
void ProtocolGame::parseMessage(InputMessage& msg)
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			@ -42,216 +40,216 @@ void ProtocolGame::parseMessage(InputMessage& msg)
 | 
			
		|||
            uint8 opt = msg.getU8();
 | 
			
		||||
 | 
			
		||||
            switch(opt) {
 | 
			
		||||
            case Otc::GameServerInitGame:
 | 
			
		||||
            case Proto::GameServerInitGame:
 | 
			
		||||
                parsePlayerLogin(msg);
 | 
			
		||||
                break;
 | 
			
		||||
            case 0x0B:
 | 
			
		||||
                parseGMActions(msg);
 | 
			
		||||
                break;
 | 
			
		||||
            case Otc::GameServerLoginError:
 | 
			
		||||
            case Proto::GameServerLoginError:
 | 
			
		||||
                parseLoginError(msg);
 | 
			
		||||
                break;
 | 
			
		||||
            case Otc::GameServerLoginAdvice:
 | 
			
		||||
            case Proto::GameServerLoginAdvice:
 | 
			
		||||
                parseFYIMessage(msg);
 | 
			
		||||
                break;
 | 
			
		||||
            case Otc::GameServerLoginWait:
 | 
			
		||||
            case Proto::GameServerLoginWait:
 | 
			
		||||
                parseWaitList(msg);
 | 
			
		||||
                break;
 | 
			
		||||
            case Otc::GameServerPing:
 | 
			
		||||
            case Proto::GameServerPing:
 | 
			
		||||
                parsePing(msg);
 | 
			
		||||
                break;
 | 
			
		||||
            //case Otc::GameServerChallange:
 | 
			
		||||
            case Otc::GameServerDead:
 | 
			
		||||
            //case Proto::GameServerChallange:
 | 
			
		||||
            case Proto::GameServerDead:
 | 
			
		||||
                parseDeath(msg);
 | 
			
		||||
                break;
 | 
			
		||||
            case Otc::GameServerFullMap:
 | 
			
		||||
            case Proto::GameServerFullMap:
 | 
			
		||||
                parseMapDescription(msg);
 | 
			
		||||
                break;
 | 
			
		||||
            case Otc::GameServerMapTopRow:
 | 
			
		||||
            case Proto::GameServerMapTopRow:
 | 
			
		||||
                parseMoveNorth(msg);
 | 
			
		||||
                break;
 | 
			
		||||
            case Otc::GameServerMapRightRow:
 | 
			
		||||
            case Proto::GameServerMapRightRow:
 | 
			
		||||
                parseMoveEast(msg);
 | 
			
		||||
                break;
 | 
			
		||||
            case Otc::GameServerMapBottomRow:
 | 
			
		||||
            case Proto::GameServerMapBottomRow:
 | 
			
		||||
                parseMoveSouth(msg);
 | 
			
		||||
                break;
 | 
			
		||||
            case Otc::GameServerMapLeftRow:
 | 
			
		||||
            case Proto::GameServerMapLeftRow:
 | 
			
		||||
                parseMoveWest(msg);
 | 
			
		||||
                break;
 | 
			
		||||
            case Otc::GameServerTileData:
 | 
			
		||||
            case Proto::GameServerTileData:
 | 
			
		||||
                parseUpdateTile(msg);
 | 
			
		||||
                break;
 | 
			
		||||
            case Otc::GameServerCreateOnMap:
 | 
			
		||||
            case Proto::GameServerCreateOnMap:
 | 
			
		||||
                parseTileAddThing(msg);
 | 
			
		||||
                break;
 | 
			
		||||
            case Otc::GameServerChangeOnMap:
 | 
			
		||||
            case Proto::GameServerChangeOnMap:
 | 
			
		||||
                parseTileTransformThing(msg);
 | 
			
		||||
                break;
 | 
			
		||||
            case Otc::GameServerDeleteOnMap:
 | 
			
		||||
            case Proto::GameServerDeleteOnMap:
 | 
			
		||||
                parseTileRemoveThing(msg);
 | 
			
		||||
                break;
 | 
			
		||||
            case Otc::GameServerMoveCreature:
 | 
			
		||||
            case Proto::GameServerMoveCreature:
 | 
			
		||||
                parseCreatureMove(msg);
 | 
			
		||||
                break;
 | 
			
		||||
            case Otc::GameServerOpenContainer:
 | 
			
		||||
            case Proto::GameServerOpenContainer:
 | 
			
		||||
                parseOpenContainer(msg);
 | 
			
		||||
                break;
 | 
			
		||||
            case Otc::GameServerCloseContainer:
 | 
			
		||||
            case Proto::GameServerCloseContainer:
 | 
			
		||||
                parseCloseContainer(msg);
 | 
			
		||||
                break;
 | 
			
		||||
            case Otc::GameServerCreateContainer:
 | 
			
		||||
            case Proto::GameServerCreateContainer:
 | 
			
		||||
                parseContainerAddItem(msg);
 | 
			
		||||
                break;
 | 
			
		||||
            case Otc::GameServerChangeInContainer:
 | 
			
		||||
            case Proto::GameServerChangeInContainer:
 | 
			
		||||
                parseContainerUpdateItem(msg);
 | 
			
		||||
                break;
 | 
			
		||||
            case Otc::GameServerDeleteInContainer:
 | 
			
		||||
            case Proto::GameServerDeleteInContainer:
 | 
			
		||||
                parseContainerRemoveItem(msg);
 | 
			
		||||
                break;
 | 
			
		||||
            case Otc::GameServerSetInventory:
 | 
			
		||||
            case Proto::GameServerSetInventory:
 | 
			
		||||
                parseAddInventoryItem(msg);
 | 
			
		||||
                break;
 | 
			
		||||
            case Otc::GameServerDeleteInventory:
 | 
			
		||||
            case Proto::GameServerDeleteInventory:
 | 
			
		||||
                parseRemoveInventoryItem(msg);
 | 
			
		||||
                break;
 | 
			
		||||
            case Otc::GameServerNpcOffer:
 | 
			
		||||
            case Proto::GameServerNpcOffer:
 | 
			
		||||
                parseOpenShopWindow(msg);
 | 
			
		||||
                break;
 | 
			
		||||
            case Otc::GameServerPlayerGoods:
 | 
			
		||||
            case Proto::GameServerPlayerGoods:
 | 
			
		||||
                parsePlayerCash(msg);
 | 
			
		||||
                break;
 | 
			
		||||
            case Otc::GameServerCloseNpcTrade:
 | 
			
		||||
            case Proto::GameServerCloseNpcTrade:
 | 
			
		||||
                parseCloseShopWindow(msg);
 | 
			
		||||
                break;
 | 
			
		||||
            case Otc::GameServerOwnOffer:
 | 
			
		||||
            case Proto::GameServerOwnOffer:
 | 
			
		||||
                parseSafeTradeRequest(msg);
 | 
			
		||||
                break;
 | 
			
		||||
            case Otc::GameServerCounterOffer:
 | 
			
		||||
            case Proto::GameServerCounterOffer:
 | 
			
		||||
                parseSafeTradeRequest(msg);
 | 
			
		||||
                break;
 | 
			
		||||
            case Otc::GameServerCloseTrade:
 | 
			
		||||
            case Proto::GameServerCloseTrade:
 | 
			
		||||
                parseSafeTradeClose(msg);
 | 
			
		||||
                break;
 | 
			
		||||
            case Otc::GameServerAmbient:
 | 
			
		||||
            case Proto::GameServerAmbient:
 | 
			
		||||
                parseWorldLight(msg);
 | 
			
		||||
                break;
 | 
			
		||||
            case Otc::GameServerGraphicalEffect:
 | 
			
		||||
            case Proto::GameServerGraphicalEffect:
 | 
			
		||||
                parseMagicEffect(msg);
 | 
			
		||||
                break;
 | 
			
		||||
            case Otc::GameServerTextEffect:
 | 
			
		||||
            case Proto::GameServerTextEffect:
 | 
			
		||||
                parseAnimatedText(msg);
 | 
			
		||||
                break;
 | 
			
		||||
            case Otc::GameServerMissleEffect:
 | 
			
		||||
            case Proto::GameServerMissleEffect:
 | 
			
		||||
                parseDistanceMissile(msg);
 | 
			
		||||
                break;
 | 
			
		||||
            case Otc::GameServerMarkCreature:
 | 
			
		||||
            case Proto::GameServerMarkCreature:
 | 
			
		||||
                parseCreatureSquare(msg);
 | 
			
		||||
                break;
 | 
			
		||||
            //case Otc::GameServerTrappers
 | 
			
		||||
            case Otc::GameServerCreatureHealth:
 | 
			
		||||
            //case Proto::GameServerTrappers
 | 
			
		||||
            case Proto::GameServerCreatureHealth:
 | 
			
		||||
                parseCreatureHealth(msg);
 | 
			
		||||
                break;
 | 
			
		||||
            case Otc::GameServerCreatureLight:
 | 
			
		||||
            case Proto::GameServerCreatureLight:
 | 
			
		||||
                parseCreatureLight(msg);
 | 
			
		||||
                break;
 | 
			
		||||
            case Otc::GameServerCreatureOutfit:
 | 
			
		||||
            case Proto::GameServerCreatureOutfit:
 | 
			
		||||
                parseCreatureOutfit(msg);
 | 
			
		||||
                break;
 | 
			
		||||
            case Otc::GameServerCreatureSpeed:
 | 
			
		||||
            case Proto::GameServerCreatureSpeed:
 | 
			
		||||
                parseCreatureSpeed(msg);
 | 
			
		||||
                break;
 | 
			
		||||
            case Otc::GameServerCreatureSkull:
 | 
			
		||||
            case Proto::GameServerCreatureSkull:
 | 
			
		||||
                parseCreatureSkulls(msg);
 | 
			
		||||
                break;
 | 
			
		||||
            case Otc::GameServerCreatureParty:
 | 
			
		||||
            case Proto::GameServerCreatureParty:
 | 
			
		||||
                parseCreatureShields(msg);
 | 
			
		||||
                break;
 | 
			
		||||
            // case Otc::GameServerCreatureUnpass
 | 
			
		||||
            case Otc::GameServerEditText:
 | 
			
		||||
            // case Proto::GameServerCreatureUnpass
 | 
			
		||||
            case Proto::GameServerEditText:
 | 
			
		||||
                parseItemTextWindow(msg);
 | 
			
		||||
                break;
 | 
			
		||||
            case Otc::GameServerEditList:
 | 
			
		||||
            case Proto::GameServerEditList:
 | 
			
		||||
                parseHouseTextWindow(msg);
 | 
			
		||||
                break;
 | 
			
		||||
            case Otc::GameServerPlayerData:
 | 
			
		||||
            case Proto::GameServerPlayerData:
 | 
			
		||||
                parsePlayerStats(msg);
 | 
			
		||||
                break;
 | 
			
		||||
            case Otc::GameServerPlayerSkills:
 | 
			
		||||
            case Proto::GameServerPlayerSkills:
 | 
			
		||||
                parsePlayerSkills(msg);
 | 
			
		||||
                break;
 | 
			
		||||
            case Otc::GameServerPlayerState:
 | 
			
		||||
            case Proto::GameServerPlayerState:
 | 
			
		||||
                parsePlayerIcons(msg);
 | 
			
		||||
                break;
 | 
			
		||||
            case Otc::GameServerClearTarget:
 | 
			
		||||
            case Proto::GameServerClearTarget:
 | 
			
		||||
                parsePlayerCancelAttack(msg);
 | 
			
		||||
                break;
 | 
			
		||||
            //case Otc::GameServerSpellDelay:
 | 
			
		||||
            //case Otc::GameServerSpellGroupDelay:
 | 
			
		||||
            case Otc::GameServerTalk:
 | 
			
		||||
            //case Proto::GameServerSpellDelay:
 | 
			
		||||
            //case Proto::GameServerSpellGroupDelay:
 | 
			
		||||
            case Proto::GameServerTalk:
 | 
			
		||||
                parseCreatureSpeak(msg);
 | 
			
		||||
                break;
 | 
			
		||||
            case Otc::GameServerChannels:
 | 
			
		||||
            case Proto::GameServerChannels:
 | 
			
		||||
                parseChannelList(msg);
 | 
			
		||||
                break;
 | 
			
		||||
            case Otc::GameServerOpenChannel:
 | 
			
		||||
            case Proto::GameServerOpenChannel:
 | 
			
		||||
                parseOpenChannel(msg);
 | 
			
		||||
                break;
 | 
			
		||||
            case Otc::GameServerPrivateChannel:
 | 
			
		||||
            case Proto::GameServerPrivateChannel:
 | 
			
		||||
                parseOpenPrivatePlayerChat(msg);
 | 
			
		||||
                break;
 | 
			
		||||
            case Otc::GameServerRuleViolation:
 | 
			
		||||
            case Otc::GameServerRuleViolation1:
 | 
			
		||||
            case Otc::GameServerRuleViolation2:
 | 
			
		||||
            case Otc::GameServerRuleViolation3:
 | 
			
		||||
            case Proto::GameServerRuleViolation:
 | 
			
		||||
            case Proto::GameServerRuleViolation1:
 | 
			
		||||
            case Proto::GameServerRuleViolation2:
 | 
			
		||||
            case Proto::GameServerRuleViolation3:
 | 
			
		||||
                parseOpenRuleViolation(msg);
 | 
			
		||||
                break;
 | 
			
		||||
            case Otc::GameServerOpenOwnChannel:
 | 
			
		||||
            case Proto::GameServerOpenOwnChannel:
 | 
			
		||||
                parseCreatePrivateChannel(msg);
 | 
			
		||||
                break;
 | 
			
		||||
            case Otc::GameServerCloseChannel:
 | 
			
		||||
            case Proto::GameServerCloseChannel:
 | 
			
		||||
                parseClosePrivateChannel(msg);
 | 
			
		||||
                break;
 | 
			
		||||
            case Otc::GameServerMessage:
 | 
			
		||||
            case Proto::GameServerMessage:
 | 
			
		||||
                parseTextMessage(msg);
 | 
			
		||||
                break;
 | 
			
		||||
            case Otc::GameServerSnapBack:
 | 
			
		||||
            case Proto::GameServerSnapBack:
 | 
			
		||||
                parseCancelWalk(msg);
 | 
			
		||||
                break;
 | 
			
		||||
            //case Otc::GameServerWait:
 | 
			
		||||
            case Otc::GameServerTopFloor:
 | 
			
		||||
            //case Proto::GameServerWait:
 | 
			
		||||
            case Proto::GameServerTopFloor:
 | 
			
		||||
                parseFloorChangeUp(msg);
 | 
			
		||||
                break;
 | 
			
		||||
            case Otc::GameServerBottomFloor:
 | 
			
		||||
            case Proto::GameServerBottomFloor:
 | 
			
		||||
                parseFloorChangeDown(msg);
 | 
			
		||||
                break;
 | 
			
		||||
            case Otc::GameServerOutfit:
 | 
			
		||||
            case Proto::GameServerOutfit:
 | 
			
		||||
                parseOutfitWindow(msg);
 | 
			
		||||
                break;
 | 
			
		||||
            case Otc::GameServerBuddyData:
 | 
			
		||||
            case Proto::GameServerBuddyData:
 | 
			
		||||
                parseVipState(msg);
 | 
			
		||||
                break;
 | 
			
		||||
            case Otc::GameServerBuddyLogin:
 | 
			
		||||
            case Proto::GameServerBuddyLogin:
 | 
			
		||||
                parseVipLogin(msg);
 | 
			
		||||
                break;
 | 
			
		||||
            case Otc::GameServerBuddyLogout:
 | 
			
		||||
            case Proto::GameServerBuddyLogout:
 | 
			
		||||
                parseVipLogout(msg);
 | 
			
		||||
                break;
 | 
			
		||||
            case Otc::GameServerTutorialHint:
 | 
			
		||||
            case Proto::GameServerTutorialHint:
 | 
			
		||||
                parseShowTutorial(msg);
 | 
			
		||||
                break;
 | 
			
		||||
            case Otc::GameServerAutomapFlag:
 | 
			
		||||
            case Proto::GameServerAutomapFlag:
 | 
			
		||||
                parseAddMarker(msg);
 | 
			
		||||
                break;
 | 
			
		||||
            case Otc::GameServerQuestLog:
 | 
			
		||||
            case Proto::GameServerQuestLog:
 | 
			
		||||
                parseQuestList(msg);
 | 
			
		||||
                break;
 | 
			
		||||
            case Otc::GameServerQuestLine:
 | 
			
		||||
            case Proto::GameServerQuestLine:
 | 
			
		||||
                parseQuestPartList(msg);
 | 
			
		||||
                break;
 | 
			
		||||
            //case Otc::GameServerChannelEvent:
 | 
			
		||||
            //case Otc::GameServerObjectInfo:
 | 
			
		||||
            //case Otc::GameServerPlayerInventory:
 | 
			
		||||
            //case Proto::GameServerChannelEvent:
 | 
			
		||||
            //case Proto::GameServerObjectInfo:
 | 
			
		||||
            //case Proto::GameServerPlayerInventory:
 | 
			
		||||
            default:
 | 
			
		||||
                Fw::throwException("unknown opt byte ", (int)opt);
 | 
			
		||||
                break;
 | 
			
		||||
| 
						 | 
				
			
			@ -746,30 +744,30 @@ void ProtocolGame::parseCreatureSpeak(InputMessage& msg)
 | 
			
		|||
    Position creaturePos;
 | 
			
		||||
 | 
			
		||||
    switch(type) {
 | 
			
		||||
        case Otc::SpeakSay:
 | 
			
		||||
        case Otc::SpeakWhisper:
 | 
			
		||||
        case Otc::SpeakYell:
 | 
			
		||||
        case Otc::SpeakMonsterSay:
 | 
			
		||||
        case Otc::SpeakMonsterYell:
 | 
			
		||||
        case Otc::SpeakPrivateNpcToPlayer:
 | 
			
		||||
        case Proto::SpeakSay:
 | 
			
		||||
        case Proto::SpeakWhisper:
 | 
			
		||||
        case Proto::SpeakYell:
 | 
			
		||||
        case Proto::SpeakMonsterSay:
 | 
			
		||||
        case Proto::SpeakMonsterYell:
 | 
			
		||||
        case Proto::SpeakPrivateNpcToPlayer:
 | 
			
		||||
            creaturePos = parsePosition(msg);
 | 
			
		||||
            break;
 | 
			
		||||
        case Otc::SpeakChannelYellow:
 | 
			
		||||
        case Otc::SpeakChannelWhite:
 | 
			
		||||
        case Otc::SpeakChannelRed:
 | 
			
		||||
        case Proto::SpeakChannelYellow:
 | 
			
		||||
        case Proto::SpeakChannelWhite:
 | 
			
		||||
        case Proto::SpeakChannelRed:
 | 
			
		||||
#if PROTOCOL==860
 | 
			
		||||
        case Otc::SpeakChannelRed2:
 | 
			
		||||
        case Proto::SpeakUnk2:
 | 
			
		||||
#endif
 | 
			
		||||
        case Otc::SpeakChannelOrange:
 | 
			
		||||
        case Proto::SpeakChannelOrange:
 | 
			
		||||
            channelId = msg.getU16();
 | 
			
		||||
            break;
 | 
			
		||||
        case Otc::SpeakPrivate:
 | 
			
		||||
        case Otc::SpeakPrivatePlayerToNpc:
 | 
			
		||||
        case Otc::SpeakBroadcast:
 | 
			
		||||
        case Otc::SpeakPrivateRed:
 | 
			
		||||
        case Proto::SpeakPrivate:
 | 
			
		||||
        case Proto::SpeakPrivatePlayerToNpc:
 | 
			
		||||
        case Proto::SpeakBroadcast:
 | 
			
		||||
        case Proto::SpeakPrivateRed:
 | 
			
		||||
            break;
 | 
			
		||||
#if PROTOCOL==860
 | 
			
		||||
        case Otc::SpeakReportChannel:
 | 
			
		||||
        case Proto::SpeakReportChannel:
 | 
			
		||||
            msg.getU32();
 | 
			
		||||
            break;
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			@ -779,16 +777,11 @@ void ProtocolGame::parseCreatureSpeak(InputMessage& msg)
 | 
			
		|||
    }
 | 
			
		||||
 | 
			
		||||
    std::string message = msg.getString();
 | 
			
		||||
    std::string typeDesc = Proto::translateSpeakType(type);
 | 
			
		||||
 | 
			
		||||
    g_dispatcher.addEvent([=] {
 | 
			
		||||
        g_lua.callGlobalField("Game", "onCreatureSpeak", name, level, type, message, channelId, creaturePos);
 | 
			
		||||
        g_game.processCreatureSpeak(name, level, typeDesc, message, channelId, creaturePos);
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    if(creaturePos.isValid()) {
 | 
			
		||||
        StaticTextPtr staticText = StaticTextPtr(new StaticText);
 | 
			
		||||
        staticText->addMessage(name, type, message);
 | 
			
		||||
        g_map.addThing(staticText, creaturePos);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ProtocolGame::parseChannelList(InputMessage& msg)
 | 
			
		||||
| 
						 | 
				
			
			@ -840,9 +833,11 @@ void ProtocolGame::parseClosePrivateChannel(InputMessage& msg)
 | 
			
		|||
void ProtocolGame::parseTextMessage(InputMessage& msg)
 | 
			
		||||
{
 | 
			
		||||
    uint8 type = msg.getU8();
 | 
			
		||||
 | 
			
		||||
    std::string typeDesc = Proto::translateMessageType(type);
 | 
			
		||||
    std::string message = msg.getString();
 | 
			
		||||
 | 
			
		||||
    g_dispatcher.addEvent(std::bind(&Game::processTextMessage, &g_game, type, message));
 | 
			
		||||
    g_dispatcher.addEvent(std::bind(&Game::processTextMessage, &g_game, typeDesc, message));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ProtocolGame::parseCancelWalk(InputMessage& msg)
 | 
			
		||||
| 
						 | 
				
			
			@ -1091,11 +1086,11 @@ ThingPtr ProtocolGame::internalGetThing(InputMessage& msg)
 | 
			
		|||
 | 
			
		||||
            if(id == (uint32)m_localPlayer->getId())
 | 
			
		||||
                creature = m_localPlayer->asCreature();
 | 
			
		||||
            else if(id >= Otc::PlayerStartId && id < Otc::PlayerEndId)
 | 
			
		||||
            else if(id >= Proto::PlayerStartId && id < Proto::PlayerEndId)
 | 
			
		||||
                creature = PlayerPtr(new Player)->asCreature();
 | 
			
		||||
            else if(id >= Otc::MonsterStartId && id < Otc::MonsterEndId)
 | 
			
		||||
            else if(id >= Proto::MonsterStartId && id < Proto::MonsterEndId)
 | 
			
		||||
                creature = CreaturePtr(new Creature);
 | 
			
		||||
            else if(id >= Otc::NpcStartId && id < Otc::NpcEndId)
 | 
			
		||||
            else if(id >= Proto::NpcStartId && id < Proto::NpcEndId)
 | 
			
		||||
                creature = CreaturePtr(new Creature);
 | 
			
		||||
            else
 | 
			
		||||
                logFatal("creature id is invalid");
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -27,9 +27,9 @@ void ProtocolGame::sendLoginPacket(uint32 timestamp, uint8 unknown)
 | 
			
		|||
{
 | 
			
		||||
    OutputMessage oMsg;
 | 
			
		||||
 | 
			
		||||
    oMsg.addU8(Otc::ClientEnterGame);
 | 
			
		||||
    oMsg.addU16(Otc::OsLinux);
 | 
			
		||||
    oMsg.addU16(Otc::ClientVersion);
 | 
			
		||||
    oMsg.addU8(Proto::ClientEnterGame);
 | 
			
		||||
    oMsg.addU16(Proto::OsLinux);
 | 
			
		||||
    oMsg.addU16(Proto::ClientVersion);
 | 
			
		||||
 | 
			
		||||
    oMsg.addU8(0); // first RSA byte must be 0
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -52,7 +52,7 @@ void ProtocolGame::sendLoginPacket(uint32 timestamp, uint8 unknown)
 | 
			
		|||
    oMsg.addPaddingBytes(128 - (29 + m_accountName.length() + m_characterName.length() + m_accountPassword.length()));
 | 
			
		||||
 | 
			
		||||
    // encrypt with RSA
 | 
			
		||||
    Rsa::encrypt((char*)oMsg.getBuffer() + 6 + oMsg.getMessageSize() - 128, 128, Otc::OtservPublicRSA);
 | 
			
		||||
    Rsa::encrypt((char*)oMsg.getBuffer() + 6 + oMsg.getMessageSize() - 128, 128, Proto::RSA);
 | 
			
		||||
 | 
			
		||||
    send(oMsg);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -62,14 +62,14 @@ void ProtocolGame::sendLoginPacket(uint32 timestamp, uint8 unknown)
 | 
			
		|||
void ProtocolGame::sendLogout()
 | 
			
		||||
{
 | 
			
		||||
    OutputMessage oMsg;
 | 
			
		||||
    oMsg.addU8(Otc::ClientQuitGame);
 | 
			
		||||
    oMsg.addU8(Proto::ClientQuitGame);
 | 
			
		||||
    send(oMsg);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ProtocolGame::sendPing()
 | 
			
		||||
{
 | 
			
		||||
    OutputMessage oMsg;
 | 
			
		||||
    oMsg.addU8(Otc::ClientPingBack);
 | 
			
		||||
    oMsg.addU8(Proto::ClientPingBack);
 | 
			
		||||
    send(oMsg);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -78,98 +78,98 @@ void ProtocolGame::sendPing()
 | 
			
		|||
void ProtocolGame::sendWalkNorth()
 | 
			
		||||
{
 | 
			
		||||
    OutputMessage oMsg;
 | 
			
		||||
    oMsg.addU8(Otc::ClientGoNorth);
 | 
			
		||||
    oMsg.addU8(Proto::ClientGoNorth);
 | 
			
		||||
    send(oMsg);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ProtocolGame::sendWalkEast()
 | 
			
		||||
{
 | 
			
		||||
    OutputMessage oMsg;
 | 
			
		||||
    oMsg.addU8(Otc::ClientGoEast);
 | 
			
		||||
    oMsg.addU8(Proto::ClientGoEast);
 | 
			
		||||
    send(oMsg);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ProtocolGame::sendWalkSouth()
 | 
			
		||||
{
 | 
			
		||||
    OutputMessage oMsg;
 | 
			
		||||
    oMsg.addU8(Otc::ClientGoSouth);
 | 
			
		||||
    oMsg.addU8(Proto::ClientGoSouth);
 | 
			
		||||
    send(oMsg);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ProtocolGame::sendWalkWest()
 | 
			
		||||
{
 | 
			
		||||
    OutputMessage oMsg;
 | 
			
		||||
    oMsg.addU8(Otc::ClientGoWest);
 | 
			
		||||
    oMsg.addU8(Proto::ClientGoWest);
 | 
			
		||||
    send(oMsg);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ProtocolGame::sendStopAutowalk()
 | 
			
		||||
{
 | 
			
		||||
    OutputMessage oMsg;
 | 
			
		||||
    oMsg.addU8(Otc::ClientStop);
 | 
			
		||||
    oMsg.addU8(Proto::ClientStop);
 | 
			
		||||
    send(oMsg);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ProtocolGame::sendWalkNorthEast()
 | 
			
		||||
{
 | 
			
		||||
    OutputMessage oMsg;
 | 
			
		||||
    oMsg.addU8(Otc::ClientGoNorthEast);
 | 
			
		||||
    oMsg.addU8(Proto::ClientGoNorthEast);
 | 
			
		||||
    send(oMsg);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ProtocolGame::sendWalkSouthEast()
 | 
			
		||||
{
 | 
			
		||||
    OutputMessage oMsg;
 | 
			
		||||
    oMsg.addU8(Otc::ClientGoSouthEast);
 | 
			
		||||
    oMsg.addU8(Proto::ClientGoSouthEast);
 | 
			
		||||
    send(oMsg);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ProtocolGame::sendWalkSouthWest()
 | 
			
		||||
{
 | 
			
		||||
    OutputMessage oMsg;
 | 
			
		||||
    oMsg.addU8(Otc::ClientGoSouthWest);
 | 
			
		||||
    oMsg.addU8(Proto::ClientGoSouthWest);
 | 
			
		||||
    send(oMsg);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ProtocolGame::sendWalkNorthWest()
 | 
			
		||||
{
 | 
			
		||||
    OutputMessage oMsg;
 | 
			
		||||
    oMsg.addU8(Otc::ClientGoNorthWest);
 | 
			
		||||
    oMsg.addU8(Proto::ClientGoNorthWest);
 | 
			
		||||
    send(oMsg);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ProtocolGame::sendTurnNorth()
 | 
			
		||||
{
 | 
			
		||||
    OutputMessage oMsg;
 | 
			
		||||
    oMsg.addU8(Otc::ClientRotateNorth);
 | 
			
		||||
    oMsg.addU8(Proto::ClientRotateNorth);
 | 
			
		||||
    send(oMsg);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ProtocolGame::sendTurnEast()
 | 
			
		||||
{
 | 
			
		||||
    OutputMessage oMsg;
 | 
			
		||||
    oMsg.addU8(Otc::ClientRotateEast);
 | 
			
		||||
    oMsg.addU8(Proto::ClientRotateEast);
 | 
			
		||||
    send(oMsg);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ProtocolGame::sendTurnSouth()
 | 
			
		||||
{
 | 
			
		||||
    OutputMessage oMsg;
 | 
			
		||||
    oMsg.addU8(Otc::ClientRotateSouth);
 | 
			
		||||
    oMsg.addU8(Proto::ClientRotateSouth);
 | 
			
		||||
    send(oMsg);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ProtocolGame::sendTurnWest()
 | 
			
		||||
{
 | 
			
		||||
    OutputMessage oMsg;
 | 
			
		||||
    oMsg.addU8(Otc::ClientRotateWest);
 | 
			
		||||
    oMsg.addU8(Proto::ClientRotateWest);
 | 
			
		||||
    send(oMsg);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ProtocolGame::sendThrow(const Position& fromPos, int thingId, int stackpos, const Position& toPos, int count)
 | 
			
		||||
{
 | 
			
		||||
    OutputMessage oMsg;
 | 
			
		||||
    oMsg.addU8(Otc::ClientMoveObject);
 | 
			
		||||
    oMsg.addU8(Proto::ClientMoveObject);
 | 
			
		||||
    addPosition(oMsg, fromPos);
 | 
			
		||||
    oMsg.addU16(thingId);
 | 
			
		||||
    oMsg.addU8(stackpos);
 | 
			
		||||
| 
						 | 
				
			
			@ -181,7 +181,7 @@ void ProtocolGame::sendThrow(const Position& fromPos, int thingId, int stackpos,
 | 
			
		|||
void ProtocolGame::sendLookInShop(int thingId, int count)
 | 
			
		||||
{
 | 
			
		||||
    OutputMessage oMsg;
 | 
			
		||||
    oMsg.addU8(Otc::ClientInspectNpcTrade);
 | 
			
		||||
    oMsg.addU8(Proto::ClientInspectNpcTrade);
 | 
			
		||||
    oMsg.addU16(thingId);
 | 
			
		||||
    oMsg.addU8(count);
 | 
			
		||||
    send(oMsg);
 | 
			
		||||
| 
						 | 
				
			
			@ -190,7 +190,7 @@ void ProtocolGame::sendLookInShop(int thingId, int count)
 | 
			
		|||
void ProtocolGame::sendPlayerPurchase(int thingId, int count, int amount, bool ignoreCapacity, bool buyWithBackpack)
 | 
			
		||||
{
 | 
			
		||||
    OutputMessage oMsg;
 | 
			
		||||
    oMsg.addU8(Otc::ClientBuyObject);
 | 
			
		||||
    oMsg.addU8(Proto::ClientBuyObject);
 | 
			
		||||
    oMsg.addU16(thingId);
 | 
			
		||||
    oMsg.addU8(count);
 | 
			
		||||
    oMsg.addU8(amount);
 | 
			
		||||
| 
						 | 
				
			
			@ -202,7 +202,7 @@ void ProtocolGame::sendPlayerPurchase(int thingId, int count, int amount, bool i
 | 
			
		|||
void ProtocolGame::sendPlayerSale(int thingId, int count, int amount, bool ignoreEquipped)
 | 
			
		||||
{
 | 
			
		||||
    OutputMessage oMsg;
 | 
			
		||||
    oMsg.addU8(Otc::ClientSellObject);
 | 
			
		||||
    oMsg.addU8(Proto::ClientSellObject);
 | 
			
		||||
    oMsg.addU16(thingId);
 | 
			
		||||
    oMsg.addU8(count);
 | 
			
		||||
    oMsg.addU8(amount);
 | 
			
		||||
| 
						 | 
				
			
			@ -213,14 +213,14 @@ void ProtocolGame::sendPlayerSale(int thingId, int count, int amount, bool ignor
 | 
			
		|||
void ProtocolGame::sendCloseShop()
 | 
			
		||||
{
 | 
			
		||||
    OutputMessage oMsg;
 | 
			
		||||
    oMsg.addU8(Otc::ClientCloseNpcTrade);
 | 
			
		||||
    oMsg.addU8(Proto::ClientCloseNpcTrade);
 | 
			
		||||
    send(oMsg);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ProtocolGame::sendRequestTrade(const Position& pos, int thingId, int stackpos, int playerId)
 | 
			
		||||
{
 | 
			
		||||
    OutputMessage oMsg;
 | 
			
		||||
    oMsg.addU8(Otc::ClientTradeObject);
 | 
			
		||||
    oMsg.addU8(Proto::ClientTradeObject);
 | 
			
		||||
    addPosition(oMsg, pos);
 | 
			
		||||
    oMsg.addU16(thingId);
 | 
			
		||||
    oMsg.addU8(stackpos);
 | 
			
		||||
| 
						 | 
				
			
			@ -231,7 +231,7 @@ void ProtocolGame::sendRequestTrade(const Position& pos, int thingId, int stackp
 | 
			
		|||
void ProtocolGame::sendLookInTrade(bool counterOffer, int index)
 | 
			
		||||
{
 | 
			
		||||
    OutputMessage oMsg;
 | 
			
		||||
    oMsg.addU8(Otc::ClientInspectTrade);
 | 
			
		||||
    oMsg.addU8(Proto::ClientInspectTrade);
 | 
			
		||||
    oMsg.addU8(counterOffer ? 0x01 : 0x00);
 | 
			
		||||
    oMsg.addU8(index);
 | 
			
		||||
    send(oMsg);
 | 
			
		||||
| 
						 | 
				
			
			@ -240,21 +240,21 @@ void ProtocolGame::sendLookInTrade(bool counterOffer, int index)
 | 
			
		|||
void ProtocolGame::sendAcceptTrade()
 | 
			
		||||
{
 | 
			
		||||
    OutputMessage oMsg;
 | 
			
		||||
    oMsg.addU8(Otc::ClientAcceptTrade);
 | 
			
		||||
    oMsg.addU8(Proto::ClientAcceptTrade);
 | 
			
		||||
    send(oMsg);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ProtocolGame::sendRejectTrade()
 | 
			
		||||
{
 | 
			
		||||
    OutputMessage oMsg;
 | 
			
		||||
    oMsg.addU8(Otc::ClientRejectTrade);
 | 
			
		||||
    oMsg.addU8(Proto::ClientRejectTrade);
 | 
			
		||||
    send(oMsg);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ProtocolGame::sendUseItem(const Position& position, int itemId, int stackpos, int index)
 | 
			
		||||
{
 | 
			
		||||
    OutputMessage oMsg;
 | 
			
		||||
    oMsg.addU8(Otc::ClientUseObject);
 | 
			
		||||
    oMsg.addU8(Proto::ClientUseObject);
 | 
			
		||||
    addPosition(oMsg, position);
 | 
			
		||||
    oMsg.addU16(itemId);
 | 
			
		||||
    oMsg.addU8(stackpos);
 | 
			
		||||
| 
						 | 
				
			
			@ -265,7 +265,7 @@ void ProtocolGame::sendUseItem(const Position& position, int itemId, int stackpo
 | 
			
		|||
void ProtocolGame::sendUseItemEx(const Position& fromPos, int fromThingId, int fromStackpos, const Position& toPos, int toThingId, int toStackpos)
 | 
			
		||||
{
 | 
			
		||||
    OutputMessage oMsg;
 | 
			
		||||
    oMsg.addU8(Otc::ClientUseTwoObjects);
 | 
			
		||||
    oMsg.addU8(Proto::ClientUseTwoObjects);
 | 
			
		||||
    addPosition(oMsg, fromPos);
 | 
			
		||||
    oMsg.addU16(fromThingId);
 | 
			
		||||
    oMsg.addU8(fromStackpos);
 | 
			
		||||
| 
						 | 
				
			
			@ -278,7 +278,7 @@ void ProtocolGame::sendUseItemEx(const Position& fromPos, int fromThingId, int f
 | 
			
		|||
void ProtocolGame::sendUseItemCreature(const Position& pos, int thingId, int stackpos, int creatureId)
 | 
			
		||||
{
 | 
			
		||||
    OutputMessage oMsg;
 | 
			
		||||
    oMsg.addU8(Otc::ClientUseOnCreature);
 | 
			
		||||
    oMsg.addU8(Proto::ClientUseOnCreature);
 | 
			
		||||
    addPosition(oMsg, pos);
 | 
			
		||||
    oMsg.addU16(thingId);
 | 
			
		||||
    oMsg.addU8(stackpos);
 | 
			
		||||
| 
						 | 
				
			
			@ -289,7 +289,7 @@ void ProtocolGame::sendUseItemCreature(const Position& pos, int thingId, int sta
 | 
			
		|||
void ProtocolGame::sendRotateItem(const Position& pos, int thingId, int stackpos)
 | 
			
		||||
{
 | 
			
		||||
    OutputMessage oMsg;
 | 
			
		||||
    oMsg.addU8(Otc::ClientTurnObject);
 | 
			
		||||
    oMsg.addU8(Proto::ClientTurnObject);
 | 
			
		||||
    addPosition(oMsg, pos);
 | 
			
		||||
    oMsg.addU16(thingId);
 | 
			
		||||
    oMsg.addU8(stackpos);
 | 
			
		||||
| 
						 | 
				
			
			@ -299,7 +299,7 @@ void ProtocolGame::sendRotateItem(const Position& pos, int thingId, int stackpos
 | 
			
		|||
void ProtocolGame::sendCloseContainer(int containerId)
 | 
			
		||||
{
 | 
			
		||||
    OutputMessage oMsg;
 | 
			
		||||
    oMsg.addU8(Otc::ClientCloseContainer);
 | 
			
		||||
    oMsg.addU8(Proto::ClientCloseContainer);
 | 
			
		||||
    oMsg.addU8(containerId);
 | 
			
		||||
    send(oMsg);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -307,7 +307,7 @@ void ProtocolGame::sendCloseContainer(int containerId)
 | 
			
		|||
void ProtocolGame::sendUpContainer(int containerId)
 | 
			
		||||
{
 | 
			
		||||
    OutputMessage oMsg;
 | 
			
		||||
    oMsg.addU8(Otc::ClientUpContainer);
 | 
			
		||||
    oMsg.addU8(Proto::ClientUpContainer);
 | 
			
		||||
    oMsg.addU8(containerId);
 | 
			
		||||
    send(oMsg);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -315,7 +315,7 @@ void ProtocolGame::sendUpContainer(int containerId)
 | 
			
		|||
void ProtocolGame::sendTextWindow(int windowTextId, const std::string& text)
 | 
			
		||||
{
 | 
			
		||||
    OutputMessage oMsg;
 | 
			
		||||
    oMsg.addU8(Otc::ClientEditText);
 | 
			
		||||
    oMsg.addU8(Proto::ClientEditText);
 | 
			
		||||
    oMsg.addU32(windowTextId);
 | 
			
		||||
    oMsg.addString(text);
 | 
			
		||||
    send(oMsg);
 | 
			
		||||
| 
						 | 
				
			
			@ -324,7 +324,7 @@ void ProtocolGame::sendTextWindow(int windowTextId, const std::string& text)
 | 
			
		|||
void ProtocolGame::sendHouseWindow(int doorId, int id, const std::string& text)
 | 
			
		||||
{
 | 
			
		||||
    OutputMessage oMsg;
 | 
			
		||||
    oMsg.addU8(Otc::ClientEditList);
 | 
			
		||||
    oMsg.addU8(Proto::ClientEditList);
 | 
			
		||||
    oMsg.addU8(doorId);
 | 
			
		||||
    oMsg.addU32(id);
 | 
			
		||||
    oMsg.addString(text);
 | 
			
		||||
| 
						 | 
				
			
			@ -334,7 +334,7 @@ void ProtocolGame::sendHouseWindow(int doorId, int id, const std::string& text)
 | 
			
		|||
void ProtocolGame::sendLookAt(const Position& position, int thingId, int stackpos)
 | 
			
		||||
{
 | 
			
		||||
    OutputMessage oMsg;
 | 
			
		||||
    oMsg.addU8(Otc::ClientLook);
 | 
			
		||||
    oMsg.addU8(Proto::ClientLook);
 | 
			
		||||
    addPosition(oMsg, position);
 | 
			
		||||
    oMsg.addU16(thingId);
 | 
			
		||||
    oMsg.addU8(stackpos);
 | 
			
		||||
| 
						 | 
				
			
			@ -347,18 +347,18 @@ void ProtocolGame::sendTalk(int channelType, int channelId, const std::string& r
 | 
			
		|||
        return;
 | 
			
		||||
 | 
			
		||||
    OutputMessage oMsg;
 | 
			
		||||
    oMsg.addU8(Otc::ClientTalk);
 | 
			
		||||
    oMsg.addU8(Proto::ClientTalk);
 | 
			
		||||
 | 
			
		||||
    assert(channelType >= 0);
 | 
			
		||||
    oMsg.addU8(channelType);
 | 
			
		||||
 | 
			
		||||
    switch(channelType) {
 | 
			
		||||
    case Otc::SpeakPrivate:
 | 
			
		||||
    case Otc::SpeakPrivateRed:
 | 
			
		||||
    case Proto::SpeakPrivate:
 | 
			
		||||
    case Proto::SpeakPrivateRed:
 | 
			
		||||
        oMsg.addString(receiver);
 | 
			
		||||
        break;
 | 
			
		||||
    case Otc::SpeakChannelYellow:
 | 
			
		||||
    case Otc::SpeakChannelRed:
 | 
			
		||||
    case Proto::SpeakChannelYellow:
 | 
			
		||||
    case Proto::SpeakChannelRed:
 | 
			
		||||
        oMsg.addU16(channelId);
 | 
			
		||||
        break;
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			@ -370,14 +370,14 @@ void ProtocolGame::sendTalk(int channelType, int channelId, const std::string& r
 | 
			
		|||
void ProtocolGame::sendGetChannels()
 | 
			
		||||
{
 | 
			
		||||
    OutputMessage oMsg;
 | 
			
		||||
    oMsg.addU8(Otc::ClientGetChannels);
 | 
			
		||||
    oMsg.addU8(Proto::ClientGetChannels);
 | 
			
		||||
    send(oMsg);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ProtocolGame::sendJoinChannel(int channelId)
 | 
			
		||||
{
 | 
			
		||||
    OutputMessage oMsg;
 | 
			
		||||
    oMsg.addU8(Otc::ClientJoinChannel);
 | 
			
		||||
    oMsg.addU8(Proto::ClientJoinChannel);
 | 
			
		||||
    oMsg.addU16(channelId);
 | 
			
		||||
    send(oMsg);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -385,7 +385,7 @@ void ProtocolGame::sendJoinChannel(int channelId)
 | 
			
		|||
void ProtocolGame::sendLeaveChannel(int channelId)
 | 
			
		||||
{
 | 
			
		||||
    OutputMessage oMsg;
 | 
			
		||||
    oMsg.addU8(Otc::ClientLeaveChannel);
 | 
			
		||||
    oMsg.addU8(Proto::ClientLeaveChannel);
 | 
			
		||||
    oMsg.addU16(channelId);
 | 
			
		||||
    send(oMsg);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -393,7 +393,7 @@ void ProtocolGame::sendLeaveChannel(int channelId)
 | 
			
		|||
void ProtocolGame::sendPrivateChannel(const std::string& receiver)
 | 
			
		||||
{
 | 
			
		||||
    OutputMessage oMsg;
 | 
			
		||||
    oMsg.addU8(Otc::ClientPrivateChannel);
 | 
			
		||||
    oMsg.addU8(Proto::ClientPrivateChannel);
 | 
			
		||||
    oMsg.addString(receiver);
 | 
			
		||||
    send(oMsg);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -406,14 +406,14 @@ void ProtocolGame::sendPrivateChannel(const std::string& receiver)
 | 
			
		|||
void ProtocolGame::sendCloseNpcChannel()
 | 
			
		||||
{
 | 
			
		||||
    OutputMessage oMsg;
 | 
			
		||||
    oMsg.addU8(Otc::ClientCloseNpcChannel);
 | 
			
		||||
    oMsg.addU8(Proto::ClientCloseNpcChannel);
 | 
			
		||||
    send(oMsg);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ProtocolGame::sendFightTatics(Otc::FightModes fightMode, Otc::ChaseModes chaseMode, bool safeFight)
 | 
			
		||||
{
 | 
			
		||||
    OutputMessage oMsg;
 | 
			
		||||
    oMsg.addU8(Otc::ClientSetTactics);
 | 
			
		||||
    oMsg.addU8(Proto::ClientSetTactics);
 | 
			
		||||
    oMsg.addU8(fightMode);
 | 
			
		||||
    oMsg.addU8(chaseMode);
 | 
			
		||||
    oMsg.addU8(safeFight ? 0x01: 0x00);
 | 
			
		||||
| 
						 | 
				
			
			@ -423,7 +423,7 @@ void ProtocolGame::sendFightTatics(Otc::FightModes fightMode, Otc::ChaseModes ch
 | 
			
		|||
void ProtocolGame::sendAttack(int creatureId)
 | 
			
		||||
{
 | 
			
		||||
    OutputMessage oMsg;
 | 
			
		||||
    oMsg.addU8(Otc::ClientAttack);
 | 
			
		||||
    oMsg.addU8(Proto::ClientAttack);
 | 
			
		||||
    oMsg.addU32(creatureId);
 | 
			
		||||
    oMsg.addU32(0);
 | 
			
		||||
    oMsg.addU32(0);
 | 
			
		||||
| 
						 | 
				
			
			@ -433,7 +433,7 @@ void ProtocolGame::sendAttack(int creatureId)
 | 
			
		|||
void ProtocolGame::sendFollow(int creatureId)
 | 
			
		||||
{
 | 
			
		||||
    OutputMessage oMsg;
 | 
			
		||||
    oMsg.addU8(Otc::ClientFollow);
 | 
			
		||||
    oMsg.addU8(Proto::ClientFollow);
 | 
			
		||||
    oMsg.addU32(creatureId);
 | 
			
		||||
    send(oMsg);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -441,7 +441,7 @@ void ProtocolGame::sendFollow(int creatureId)
 | 
			
		|||
void ProtocolGame::sendInviteToParty(int creatureId)
 | 
			
		||||
{
 | 
			
		||||
    OutputMessage oMsg;
 | 
			
		||||
    oMsg.addU8(Otc::ClientInviteToParty);
 | 
			
		||||
    oMsg.addU8(Proto::ClientInviteToParty);
 | 
			
		||||
    oMsg.addU32(creatureId);
 | 
			
		||||
    send(oMsg);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -449,7 +449,7 @@ void ProtocolGame::sendInviteToParty(int creatureId)
 | 
			
		|||
void ProtocolGame::sendJoinParty(int creatureId)
 | 
			
		||||
{
 | 
			
		||||
    OutputMessage oMsg;
 | 
			
		||||
    oMsg.addU8(Otc::ClientJoinParty);
 | 
			
		||||
    oMsg.addU8(Proto::ClientJoinParty);
 | 
			
		||||
    oMsg.addU32(creatureId);
 | 
			
		||||
    send(oMsg);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -457,7 +457,7 @@ void ProtocolGame::sendJoinParty(int creatureId)
 | 
			
		|||
void ProtocolGame::sendRevokeInvitation(int creatureId)
 | 
			
		||||
{
 | 
			
		||||
    OutputMessage oMsg;
 | 
			
		||||
    oMsg.addU8(Otc::ClientRevokeInvitation);
 | 
			
		||||
    oMsg.addU8(Proto::ClientRevokeInvitation);
 | 
			
		||||
    oMsg.addU32(creatureId);
 | 
			
		||||
    send(oMsg);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -465,7 +465,7 @@ void ProtocolGame::sendRevokeInvitation(int creatureId)
 | 
			
		|||
void ProtocolGame::sendPassLeadership(int creatureId)
 | 
			
		||||
{
 | 
			
		||||
    OutputMessage oMsg;
 | 
			
		||||
    oMsg.addU8(Otc::ClientPassLeadership);
 | 
			
		||||
    oMsg.addU8(Proto::ClientPassLeadership);
 | 
			
		||||
    oMsg.addU32(creatureId);
 | 
			
		||||
    send(oMsg);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -473,14 +473,14 @@ void ProtocolGame::sendPassLeadership(int creatureId)
 | 
			
		|||
void ProtocolGame::sendLeaveParty()
 | 
			
		||||
{
 | 
			
		||||
    OutputMessage oMsg;
 | 
			
		||||
    oMsg.addU8(Otc::ClientLeaveParty);
 | 
			
		||||
    oMsg.addU8(Proto::ClientLeaveParty);
 | 
			
		||||
    send(oMsg);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ProtocolGame::sendShareExperience(bool active, int unknown)
 | 
			
		||||
{
 | 
			
		||||
    OutputMessage oMsg;
 | 
			
		||||
    oMsg.addU8(Otc::ClientShareExperience);
 | 
			
		||||
    oMsg.addU8(Proto::ClientShareExperience);
 | 
			
		||||
    oMsg.addU8(active ? 0x01 : 0x00);
 | 
			
		||||
    oMsg.addU8(unknown);
 | 
			
		||||
    send(oMsg);
 | 
			
		||||
| 
						 | 
				
			
			@ -489,14 +489,14 @@ void ProtocolGame::sendShareExperience(bool active, int unknown)
 | 
			
		|||
void ProtocolGame::sendOpenChannel()
 | 
			
		||||
{
 | 
			
		||||
    OutputMessage oMsg;
 | 
			
		||||
    oMsg.addU8(Otc::ClientOpenChannel);
 | 
			
		||||
    oMsg.addU8(Proto::ClientOpenChannel);
 | 
			
		||||
    send(oMsg);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ProtocolGame::sendInviteToChannel(const std::string& name)
 | 
			
		||||
{
 | 
			
		||||
    OutputMessage oMsg;
 | 
			
		||||
    oMsg.addU8(Otc::ClientInviteToChannel);
 | 
			
		||||
    oMsg.addU8(Proto::ClientInviteToChannel);
 | 
			
		||||
    oMsg.addString(name);
 | 
			
		||||
    send(oMsg);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -504,7 +504,7 @@ void ProtocolGame::sendInviteToChannel(const std::string& name)
 | 
			
		|||
void ProtocolGame::sendExcludeFromChannel(const std::string& name)
 | 
			
		||||
{
 | 
			
		||||
    OutputMessage oMsg;
 | 
			
		||||
    oMsg.addU8(Otc::ClientExcludeFromChannel);
 | 
			
		||||
    oMsg.addU8(Proto::ClientExcludeFromChannel);
 | 
			
		||||
    oMsg.addString(name);
 | 
			
		||||
    send(oMsg);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -512,7 +512,7 @@ void ProtocolGame::sendExcludeFromChannel(const std::string& name)
 | 
			
		|||
void ProtocolGame::sendCancel()
 | 
			
		||||
{
 | 
			
		||||
    OutputMessage oMsg;
 | 
			
		||||
    oMsg.addU8(Otc::ClientCancel);
 | 
			
		||||
    oMsg.addU8(Proto::ClientCancel);
 | 
			
		||||
    send(oMsg);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -521,21 +521,21 @@ void ProtocolGame::sendCancel()
 | 
			
		|||
void ProtocolGame::sendUpdateContainer()
 | 
			
		||||
{
 | 
			
		||||
    OutputMessage oMsg;
 | 
			
		||||
    oMsg.addU8(Otc::ClientRefreshContainer);
 | 
			
		||||
    oMsg.addU8(Proto::ClientRefreshContainer);
 | 
			
		||||
    send(oMsg);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ProtocolGame::sendGetOutfit()
 | 
			
		||||
{
 | 
			
		||||
    OutputMessage oMsg;
 | 
			
		||||
    oMsg.addU8(Otc::ClientGetOutfit);
 | 
			
		||||
    oMsg.addU8(Proto::ClientGetOutfit);
 | 
			
		||||
    send(oMsg);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ProtocolGame::sendSetOutfit(const Outfit& outfit)
 | 
			
		||||
{
 | 
			
		||||
    OutputMessage oMsg;
 | 
			
		||||
    oMsg.addU8(Otc::ClientSetOutfit);
 | 
			
		||||
    oMsg.addU8(Proto::ClientSetOutfit);
 | 
			
		||||
 | 
			
		||||
    oMsg.addU16(outfit.getType());
 | 
			
		||||
    oMsg.addU8(outfit.getHead());
 | 
			
		||||
| 
						 | 
				
			
			@ -550,7 +550,7 @@ void ProtocolGame::sendSetOutfit(const Outfit& outfit)
 | 
			
		|||
void ProtocolGame::sendAddVip(const std::string& name)
 | 
			
		||||
{
 | 
			
		||||
    OutputMessage oMsg;
 | 
			
		||||
    oMsg.addU8(Otc::ClientAddBuddy);
 | 
			
		||||
    oMsg.addU8(Proto::ClientAddBuddy);
 | 
			
		||||
    oMsg.addString(name);
 | 
			
		||||
    send(oMsg);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -558,7 +558,7 @@ void ProtocolGame::sendAddVip(const std::string& name)
 | 
			
		|||
void ProtocolGame::sendRemoveVip(int playerId)
 | 
			
		||||
{
 | 
			
		||||
    OutputMessage oMsg;
 | 
			
		||||
    oMsg.addU8(Otc::ClientRemoveBuddy);
 | 
			
		||||
    oMsg.addU8(Proto::ClientRemoveBuddy);
 | 
			
		||||
    oMsg.addU32(playerId);
 | 
			
		||||
    send(oMsg);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -570,14 +570,14 @@ void ProtocolGame::sendRemoveVip(int playerId)
 | 
			
		|||
void ProtocolGame::sendGetQuestLog()
 | 
			
		||||
{
 | 
			
		||||
    OutputMessage oMsg;
 | 
			
		||||
    oMsg.addU8(Otc::ClientGetQuestLog);
 | 
			
		||||
    oMsg.addU8(Proto::ClientGetQuestLog);
 | 
			
		||||
    send(oMsg);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ProtocolGame::sendGetQuestLine(int questId)
 | 
			
		||||
{
 | 
			
		||||
    OutputMessage oMsg;
 | 
			
		||||
    oMsg.addU8(Otc::ClientGetQuestLine);
 | 
			
		||||
    oMsg.addU8(Proto::ClientGetQuestLine);
 | 
			
		||||
    oMsg.addU16(questId);
 | 
			
		||||
    send(oMsg);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -57,16 +57,16 @@ void ProtocolLogin::onRecv(InputMessage& inputMessage)
 | 
			
		|||
        while(!inputMessage.eof()) {
 | 
			
		||||
            uint8 opt = inputMessage.getU8();
 | 
			
		||||
            switch(opt) {
 | 
			
		||||
            case Otc::LoginServerError:
 | 
			
		||||
            case Proto::LoginServerError:
 | 
			
		||||
                parseError(inputMessage);
 | 
			
		||||
                break;
 | 
			
		||||
            case Otc::LoginServerMotd:
 | 
			
		||||
            case Proto::LoginServerMotd:
 | 
			
		||||
                parseMOTD(inputMessage);
 | 
			
		||||
                break;
 | 
			
		||||
            case Otc::LoginServerUpdateNeeded:
 | 
			
		||||
            case Proto::LoginServerUpdateNeeded:
 | 
			
		||||
                callLuaField("onError", "Client needs update.");
 | 
			
		||||
                break;
 | 
			
		||||
            case Otc::LoginServerCharacterList:
 | 
			
		||||
            case Proto::LoginServerCharacterList:
 | 
			
		||||
                parseCharacterList(inputMessage);
 | 
			
		||||
                break;
 | 
			
		||||
            default:
 | 
			
		||||
| 
						 | 
				
			
			@ -89,13 +89,13 @@ void ProtocolLogin::sendLoginPacket()
 | 
			
		|||
{
 | 
			
		||||
    OutputMessage oMsg;
 | 
			
		||||
 | 
			
		||||
    oMsg.addU8(Otc::ClientEnterAccount);
 | 
			
		||||
    oMsg.addU16(Otc::OsLinux);
 | 
			
		||||
    oMsg.addU16(Otc::ClientVersion);
 | 
			
		||||
    oMsg.addU8(Proto::ClientEnterAccount);
 | 
			
		||||
    oMsg.addU16(Proto::OsLinux);
 | 
			
		||||
    oMsg.addU16(Proto::ClientVersion);
 | 
			
		||||
 | 
			
		||||
    oMsg.addU32(g_thingsType.getSignature()); // data signature
 | 
			
		||||
    oMsg.addU32(g_sprites.getSignature()); // sprite signature
 | 
			
		||||
    oMsg.addU32(Otc::PicSignature); // pic signature
 | 
			
		||||
    oMsg.addU32(Proto::PicSignature); // pic signature
 | 
			
		||||
 | 
			
		||||
    oMsg.addU8(0); // first RSA byte must be 0
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -111,7 +111,7 @@ void ProtocolLogin::sendLoginPacket()
 | 
			
		|||
 | 
			
		||||
    // complete the 128 bytes for rsa encryption with zeros
 | 
			
		||||
    oMsg.addPaddingBytes(128 - (21 + m_accountName.length() + m_accountPassword.length()));
 | 
			
		||||
    Rsa::encrypt((char*)oMsg.getBuffer() + InputMessage::DATA_POS + oMsg.getMessageSize() - 128, 128, Otc::OtservPublicRSA);
 | 
			
		||||
    Rsa::encrypt((char*)oMsg.getBuffer() + InputMessage::DATA_POS + oMsg.getMessageSize() - 128, 128, Proto::RSA);
 | 
			
		||||
 | 
			
		||||
    send(oMsg);
 | 
			
		||||
    enableXteaEncryption();
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue