--[[ lama is a MUD server made in Lua. Copyright (C) 2013 Curtis Erickson This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. ]] --- Cloneable that handles relationships between Clients and Mobs. -- @author milkmanjack module("obj.Player", package.seeall) local Cloneable = require("obj.Cloneable") --- Cloneable that handles relationships between Clients and Mobs. -- @class table -- @name Player -- @field id Our unique ID. -- @field state Current state. Always a member of the PlayerState table. -- @field client The Client we are associated with. -- @field mob The Mob we are associated with. -- @field messageMode Our message mode. Always a member of the MessageMode table. -- @field nanny A table containing data for use with logging in. local Player = Cloneable.clone() -- runtime data Player.id = -1 Player.state = PlayerState.NEW Player.client = nil -- the client attached to this player Player.mob = nil -- the mob attached to this player Player.messageMode = nil -- the current message mode --- Initialize the Player and associated it with the given Client. -- @param client Client to be associated with this Player. function Player:initialize(client) self.nanny = {} -- data for nanny stuff self:setClient(client) end --- Returns the string-value of the Player. -- @return A string in the format of <tt>"player#<id>{@<client remote address>}"</tt>. function Player:toString() return string.format("[P#%d]%s@%s", self.id, self.mob and self.mob:getName() or "no mob", self.client:getAddress()) end --- shortcut to client:send(data,i,j). function Player:send(data, i, j) return self.client:send(data,i,j) end --- Reset messageMode to nil. function Player:clearMessageMode() self.messageMode = nil end --- Set message mode. -- @param mode The mode to assign. Always a member of the MessageMode table. function Player:setMessageMode(mode) self.messageMode = mode end --- Sends a message to the Player. -- @param msg The message to send. -- @param mode The mode of the message. Always a member of the MessageMode table. -- @param autobreak If true (default), the message is followed by a linefeed. Always a member of the MessageMode table. function Player:sendMessage(msg, mode, autobreak) if mode == nil then mode = MessageMode.GENERAL end if autobreak == nil then autobreak = true end local oldMode = self:getMessageMode() if oldMode ~= mode then self:setMessageMode(mode) -- separate the next message from the previous -- but only if the previous mode was not nil if oldMode ~= nil then self:sendString("\n") end end -- if autobreak is true, append a linebreak to the message. (default) if autobreak == true then self:sendString(msg.."\n") -- otherwise, just send it as a string with no linebreak else self:sendString(msg) end end --- shortcut to sendMessage() that provides the MessageMode.QUESTION mode, followed by no linebreak. function Player:askQuestion(msg) self:sendMessage(msg, MessageMode.QUESTION, false) end --- shortcut to client:sendMessage(str). function Player:sendString(str) str = Color.colorize(str) return self.client:sendString(str) end --- Set ID. -- @param id The ID to set. function Player:setID(id) self.id = id end --- Set state. -- @param state The state to set. function Player:setState(state) self.state = state end --- Associate this Player with the given Mob. A Player's Mob -- shares a mututal reference with the Player, so when the -- Player's Mob changes, so does the Mob's Player. -- @param mob The mob to assign. function Player:setMob(mob) if self.mob then self.mob:unsetPlayer(self) end self.mob = mob -- make sure it's mutual if mob:getPlayer() ~= self then mob:setPlayer(self) end end --- De-associate this Player from current Mob. function Player:unsetMob() local oldMob = self.mob self.mob = nil -- make sure it's mutual if oldMob:getPlayer() == self then oldMob:unsetPlayer() end end --- Associate this Player with the given Client. -- @param client Client to be associated. function Player:setClient(client) self.client = client end --- De-associate this Player from current Client. function Player:unsetClient() self.client = nil end --- Gets current ID. -- @return Current ID. function Player:getID() return self.id end --- Gets current state. -- @return Current state. Always a member of the PlayerState table. function Player:getState() return self.state end --- Gets current Client. -- @return Current Client. function Player:getClient() return self.client end --- Gets current Mob. -- @return Current Mob, if any. function Player:getMob() return self.mob end --- Get message mode. -- @return Current message mode. Always a member of the MessageMode table. function Player:getMessageMode() return self.messageMode end return Player