<?php require_once('../tools/validate_cookie.php'); include_once('../login/config.php'); include_once('../tools/domain_info.php'); include_once('ring_session_manager_itf.php'); class JoinShardCb extends CRingSessionManagerWeb { /** * Join the specified shard */ function joinSessionResult($userId, $sessionId, $result, $shardAddr, $participantStatus) { global $JoinSessionResultCode, $JoinSessionResultMsg; $JoinSessionResultCode = $result; $JoinSessionResultMsg = $shardAddr; if ($result != 0) { global $FSHostLuaMode, $FSHostResult, $FSHostResultStr; $FSHostResult = 0; $FSHostResultStr = "Error ".$result." : '".$shardAddr."' while trying to join a shard"; if ($FSHostLuaMode) { echo $FSHostResultStr; echo '<p><p><a href="web_start.php">Back to menu</a>'; } } else { // ok, we have the info to connect ! // generate the lua script $cookie=convertCookieForActionHandler($_COOKIE["ryzomId"]); global $FSHostLuaMode, $FSHostResult, $FSHostResultStr; $FSHostResult = 1; $FSHostResultStr = $shardAddr; if ($FSHostLuaMode) { $luaScript='runAH(nil, "on_connect_to_shard", "cookie='.$cookie.'|fsAddr='.$shardAddr.'")'; //echo 'luaScript : '.$luaScript.'<br>'; echo '<lua>'.$luaScript.'</lua>'; global $verbose; if ($verbose) echo '<br>Teleporting to shard<br>'; } } } /** * Receive the result of the shard list, then call the global $getShardListCallback with the associative array as argument */ function getShardsResult($userId, $resultStr) { global $getShardListCallback; $onlineShardsBySessionId = array(); $resultArray = split(';', $resultStr); foreach ($resultArray as $shardInfo) { $shardAttr = split(',', $shardInfo); if (isset($shardAttr[1])) $onlineShardsBySessionId[$shardAttr[0]] = $shardAttr[1]; } $getShardListCallback($onlineShardsBySessionId); } } // External use $FSHostLuaMode = false; $FSHostResultStr = 0; // Internal use $verbose = true; $FSHostResult = 0; // THE ABOVE DECLARATIONS ARE NEEDED FOR ALL CODE BELOW THIS LINE if (isset($_POST["ml"])) joinMainlandPost(); if (isset($_POST["destSessionId"])) joinShardFromIdPost($_POST["destSessionId"]); /** * Authenticate and request to join a mainland shard */ function joinMainlandPost() { global $FSHostLuaMode; $FSHostLuaMode = true; $domainId = -1; if (!validateCookie($userId, $domainId, $charId)) { echo "Invalid cookie !"; die(); } else { joinMainland($userId, $domainId); } } /** * Authenticate and request to join the specified shard */ function joinShardFromIdPost( $destSessionId ) { $domainId = -1; if (!validateCookie($userId, $domainId, $charId)) { echo "Invalid cookie !"; die(); } else { joinShardFromId($userId, $domainId, $destSessionId); } } /** * Request to join the specified shard */ function joinShardFromId( $userId, $domainId, $destSessionId ) { $domainInfo = getDomainInfo($domainId); $addr = split(":", $domainInfo["session_manager_address"]); $RSMHost = $addr[0]; $RSMPort = $addr[1]; // request join to the session manager $joinShard = new JoinShardCb; $res = ""; $joinShard->connect($RSMHost, $RSMPort, $res); $charSlot = getCharSlot(); // if ingame (!=15), the RSM can check if this character has the right to connect to the specified shard $charId = ($userId<<4) + $charSlot; echo "Requesting teleportation of $charId/$userId to shard session ".$destSessionId."...<br>"; $joinShard->joinSession($charId, $destSessionId, $domainInfo["domain_name"]); // wait the the return message if ($joinShard->waitCallback() == false) { // Note: the answer is a joinSessionResult message echo "No response from server, joinShard failed<br>"; } exit; } /** * Request to get the shard list */ function getShardList($userId, $domainId) { $domainInfo = getDomainInfo($domainId); $addr = split(":", $domainInfo["session_manager_address"]); $RSMHost = $addr[0]; $RSMPort = $addr[1]; // request get to the session manager $joinShard = new JoinShardCb; $res = ""; $joinShard->connect($RSMHost, $RSMPort, $res); $charId = ($userId<<4)+15; echo "Retrieving online shards for $charId...<br>"; $joinShard->getShards($charId); // wait the the return message if ($joinShard->waitCallback() == false) { echo "No response from server, getShards failed<br>"; } exit; } /** * Display the list of mainland shards * This is a candidate to the callback $getShardListCallback */ function displayAllShards(&$onlineShardsBySessionId) { // Get the userId and domainId back $domainId = -1; if (!validateCookie($userId, $domainId, $charId)) { echo "Invalid cookie !"; die(); } // List all shards of the domain, including offline ones global $DBName; mysql_select_db ($DBName) or die ("Can't access to the db dbname:$DBName"); $query = "select * from shard where domain_id = $domainId"; $resShards = mysql_query ($query) or die ("Can't execute the query: ".$query." ".mysql_error()); echo "Select a shard to join:<br>"; //echo "<form name='far_tp' action='join_shard.php' method='post'>"; while ($rowShard = mysql_fetch_array($resShards)) { $mainlandSessionId = $rowShard['FixedSessionId']; $isOnline = isset($onlineShardsBySessionId[$mainlandSessionId]); // Radio button not supported by Client's html component. Instead: one form (button) per shard. //echo "<input type='radio' name='destSessionId' value='".$mainlandSessionId."' ".($isOnline?"":"disabled ")."/>".$rowShard['Name']." (".($isOnline?"online with $nbOnlinePlayers players":"offline").", version ".$rowShard['Version'].")<br>"; echo "<form name='far_tp_".$rowShard['ShardId']."' action='join_shard.php' method='post'>"; echo "<input type='hidden' name='destSessionId' value='".$mainlandSessionId."' />"; echo "<input type='hidden' name='charSlot' value='".getCharSlot()."'>"; echo " ".$rowShard['Name']." ".$rowShard['ShardId']." (".($isOnline ? $onlineShardsBySessionId[$mainlandSessionId]." online)" : "offline)"); if ($isOnline) echo "<input type='submit' name='button' value='Teleport' />"; echo "</form><br>"; } //echo "<input type='submit' name='button' value='Teleport' />"; //echo "</form></font>"; exit; } /** * Auto-join a shard. * Returns true in case of success, and the FSHost address in $FSHostResultStr. * Returns false in case of error, and an explanatory string in $FSHostResultStr. */ function joinMainland($userId, $domainId) { $domainInfo = getDomainInfo($domainId); $addr = split(":", $domainInfo["session_manager_address"]); $RSMHost = $addr[0]; $RSMPort = $addr[1]; // request get to the session manager $joinsShard = new JoinShardCb; $res = ""; $joinsShard->connect($RSMHost, $RSMPort, $res); // set the shard Id to allow any character (by using the special value '15') $charId = ($userId<<4)+15; global $FSHostLuaMode, $verbose; if ($FSHostLuaMode && $verbose) echo "Joining a mainland shard for $charId...<br>"; $joinsShard->joinMainland($charId, $domainInfo["domain_name"]); // wait the the return message if ($joinsShard->waitCallback() == false) { global $FSHostResultStr; $FSHostResultStr = "No response from server for joinMainland<br>"; return false; } global $FSHostResult; return $FSHostResult; } ?>