--------------------------------------------------------------
-- Includes
--------------------------------------------------------------
require('o_mis')
--------------------------------------------------------------
-- Constants
--------------------------------------------------------------
-- Start Location for the Zone
CONSTANTS = {}
CONSTANTS["PLAYER_START_POS"] = {x = -15.711255, y = 276.552267, z = -13.312634}
CONSTANTS["PLAYER_START_ROT"] = {w = 0.91913521289825, x = 0, y = 0.39394217729568, z = 0}
CONSTANTS["NPC_START_POS"] = { x = 156.0, y = 270.06, z = 145.0 }
-- cannon constants
CONSTANTS["CANNON_TEMPLATEID"] = 1864
CONSTANTS["CANNON_PLAYER_OFFSET"] = {x = 0, y = 0, z = 0}
CONSTANTS["CANNON_VELOCITY"] = 100.0
CONSTANTS["CANNON_MIN_DISTANCE"] = 30.0
CONSTANTS["CANNON_REFIRE_RATE"] = 800.0
CONSTANTS["CANNON_BARREL_OFFSET"] = {x = 0, y = 4.3, z = 9}
CONSTANTS["CANNON_TIMEOUT"] = 60.0
-- Other constants
CONSTANTS["FLOATING_TARGET"] = 2565
CONSTANTS["FLOATING_PATH_NAME"] = "TestPath"
CONSTANTS["FLOATING_TARGET_SPAWN_TIME"] = 5.0
--------------------------------------------------------------
-- Helper Functions
--------------------------------------------------------------
--------------------------------------------------------------
-- store an object by name
--------------------------------------------------------------
function storeObjectByName(self, varName, object)
idString = object:GetID()
finalID = "|" .. idString
self:SetVar(varName, finalID)
end
--------------------------------------------------------------
-- get an object by name
--------------------------------------------------------------
function getObjectByName(self, varName)
targetID = self:GetVar(varName)
if (targetID) then
return GAMEOBJ:GetObjectByID(targetID)
else
return nil
end
end
--------------------------------------------------------------
-- try to start the game
--------------------------------------------------------------
function startGame(self, bSendRequest)
-- get the cannon
local cannon = getObjectByName(self, "cannonObject")
-- get the player
local player = getObjectByName(self, "activityPlayer")
-- if we have both start it
if ((cannon) and (player)) then
-- send request to start cannon if needed
if (bSendRequest == true) then
cannon:RequestActivityStartStop{bStart = true, userID = player}
end
end
end
--------------------------------------------------------------
-- try to stop the game
--------------------------------------------------------------
function stopGame(self, bSendRequest)
-- get the cannon
local cannon = getObjectByName(self, "cannonObject")
-- get the player
local player = getObjectByName(self, "activityPlayer")
-- if we have both stop it if we need to
if ((bSendRequest == true) and (cannon) and (player)) then
cannon:RequestActivityStartStop{bStart = false, userID = player}
end
DoGameShutdown(self)
end
--------------------------------------------------------------
-- handle all the game startup data
--------------------------------------------------------------
function DoGameStartup(self)
-- set game state and vars
self:SetVar("GameStarted", true)
self:SetVar("GameScore",0)
self:SetVar("GameTime",0)
-- spawn floating thing
GAMEOBJ:GetTimer():AddTimerWithCancel( CONSTANTS["FLOATING_TARGET_SPAWN_TIME"], "SpawnFloater",self )
end
--------------------------------------------------------------
-- handle all the game shutdown data
--------------------------------------------------------------
function DoGameShutdown(self)
self:SetVar("GameStarted", false)
-- cancel all timers
GAMEOBJ:GetTimer():CancelAllTimers( self )
end
--------------------------------------------------------------
-- show the summary dialog
--------------------------------------------------------------
function showSummaryDialog(self)
-- get player
local player = getObjectByName(self, "activityPlayer")
if (player) then
-- get the player's score and time
local score = self:GetVar("GameScore")
local time = self:GetVar("GameTime")
local strText = ""
if (score and time) then
strText = "Your Score is " .. score .. ".
Retry?"
else
strText = "Retry?"
end
-- show the summary message box
player:DisplayMessageBox{bShow = true,
imageID = 2,
callbackClient = GAMEOBJ:GetZoneControlID(),
text = strText,
identifier = "Shooting_Gallery_Summary"}
end
end
--------------------------------------------------------------
-- Game Message Handlers
--------------------------------------------------------------
--------------------------------------------------------------
-- Startup
--------------------------------------------------------------
function onStartup(self)
-- set game state
self:SetVar("GameStarted", false)
self:SetVar("GameScore",0)
self:SetVar("GameTime",0)
end
--------------------------------------------------------------
-- Timers
--------------------------------------------------------------
onTimerDone = function(self, msg)
if msg.name == "SpawnFloater" then
RESMGR:LoadObject { objectTemplate = CONSTANTS["FLOATING_TARGET"],
bIsSmashable = true,
x = 32,
y = 290,
z = 32,
owner = self }
-- spawn more
GAMEOBJ:GetTimer():AddTimerWithCancel( CONSTANTS["FLOATING_TARGET_SPAWN_TIME"], "SpawnFloater",self )
end
end
--------------------------------------------------------------
-- Called when a Child is loaded
--------------------------------------------------------------
function onChildLoaded(self, msg)
if msg.templateID == CONSTANTS["FLOATING_TARGET"] then
-- set the path
msg.childID:SetMovingPlatformParams{ wsPlatformPath = "TestPath", iStartIndex = 0 }
end
end
--------------------------------------------------------------
-- Called when Player Loads into Zone
--------------------------------------------------------------
function onPlayerLoaded(self, msg)
print ("Player Entered: " .. msg.playerID:GetName().name)
-- stun and move player to level start location
-- @TODO: Sometimes this teleport works and sometimes it does not.....
local player = msg.playerID
player:ServerSetUserCtrlCompPause{bPaused = true}
player:Teleport{pos = CONSTANTS["PLAYER_START_POS"],
x = CONSTANTS["PLAYER_START_ROT"].x,
y = CONSTANTS["PLAYER_START_ROT"].y,
z = CONSTANTS["PLAYER_START_ROT"].z,
w = CONSTANTS["PLAYER_START_ROT"].w,
bSetRotation = true}
if (self:GetVar("GameStarted") == false) then
-- get the player
local player = getObjectByName(self, "activityPlayer")
-- store the player for later use
if (player == nil) then
storeObjectByName(self, "activityPlayer", msg.playerID)
end
-- try to start the game
startGame(self, true)
end
end
--------------------------------------------------------------
-- Sent from an object after loading into zone
--------------------------------------------------------------
function onObjectLoaded(self, msg)
-- Cannon Object Loaded
if (msg.templateID == CONSTANTS["CANNON_TEMPLATEID"]) then
-- Override the cannon shooting parameters
msg.objectID:SetShootingGalleryParams{playerPosOffset = CONSTANTS["CANNON_PLAYER_OFFSET"],
projectileVelocity = CONSTANTS["CANNON_VELOCITY"],
cooldown = CONSTANTS["CANNON_REFIRE_RATE"],
muzzlePosOffset = CONSTANTS["CANNON_BARREL_OFFSET"],
minDistance = CONSTANTS["CANNON_MIN_DISTANCE"],
timeLimit = CONSTANTS["CANNON_TIMEOUT"]}
-- store the cannon object for use later
storeObjectByName(self, "cannonObject", msg.objectID)
if (self:GetVar("GameStarted") == false) then
-- try to start the game
startGame(self, true)
end
end
end
--------------------------------------------------------------
-- Sent from the cannon when a player starts or stops the activity
--------------------------------------------------------------
function onRequestActivityStartStop(self, msg)
-- if the user quit, stop the game
if (msg.bStart == false) then
stopGame(self, false)
showSummaryDialog(self)
elseif (msg.bStart == true) then
-- get the player
local player = getObjectByName(self, "activityPlayer")
-- store the player just in case
if (player == nil) then
player = msg.userID
storeObjectByName(self, "activityPlayer", player)
end
-- start the game
startGame(self,false)
DoGameStartup(self)
end
end
--------------------------------------------------------------
-- Sent from the cannon to get a score for the player
--------------------------------------------------------------
function onDoCalculateActivityRating(self, msg)
-- save the score and time for later use
self:SetVar("GameScore",msg.fValue1)
self:SetVar("GameTime",msg.fValue2)
-- also return the score as the result for the activity
msg.outActivityRating = msg.fValue1
return msg
end
--------------------------------------------------------------
-- Sent from a player when responding from a messagebox
--------------------------------------------------------------
function onMessageBoxRespond(self, msg)
-- make sure this is the right player
local player = getObjectByName(self, "activityPlayer")
if (player:GetID() == msg.sender:GetID()) then
-- User wants to retry
if (msg.iButton == 1 and msg.identifier == "Shooting_Gallery_Summary") then
startGame(self,true)
-- User wants to quit
elseif (msg.iButton == 0 and msg.identifier == "Shooting_Gallery_Summary") then
-- go back to the other zone
player:ServerSetUserCtrlCompPause{bPaused = false}
player:TransferToLastNonInstance{ playerID = player, bUseLastPosition = true }
end
end
end