// ----------------------------------------------------------------------------------- // Use // @Server // ----------------------------------------------------------------------------------- public override void Use(Player player, int inventoryIndex) { ItemSlot slot = player.inventory[inventoryIndex]; // -- Only activate if enough charges left if (decreaseAmount == 0 || slot.amount >= decreaseAmount) { // always call base function too base.Use(player, inventoryIndex); // -- Decrease Amount if (decreaseAmount != 0) { slot.DecreaseAmount(decreaseAmount); player.inventory[inventoryIndex] = slot; } // -- Determine Teleportation Target if (teleportToClosestSpawnpoint) { Transform target = NetworkManagerMMO.GetNearestStartPosition(player.transform.position); player.UCE_Warp(target.position); } else { teleportationTarget.OnTeleport(player); } } }
// ----------------------------------------------------------------------------------- // Apply // ----------------------------------------------------------------------------------- public override void Use(Player player, int inventoryIndex) { ItemSlot slot = player.inventory[inventoryIndex]; // -- Only activate if enough charges left if (decreaseAmount == 0 || slot.amount >= decreaseAmount) { if (player.InParty()) { // always call base function too base.Use(player, inventoryIndex); foreach (string member in (player.party.members)) { Player plyr = UCE_Tools.FindOnlinePlayerByName(member); // -- Teleport everybody but not the caster if (plyr != null && plyr != player) { // -- Check Distance if (maxDistanceToCaster <= 0 || Utils.ClosestDistance(player.collider, plyr.collider) <= maxDistanceToCaster || member == player.party.master) { // -- Determine Teleportation Target if (teleportToClosestSpawnpoint) { Transform target = NetworkManagerMMO.GetNearestStartPosition(plyr.transform.position); plyr.UCE_Warp(target.position); } else { teleportationTarget.OnTeleport(plyr); } } plyr = null; } } // decrease amount slot.DecreaseAmount(decreaseAmount); player.inventory[inventoryIndex] = slot; // -- Teleport the caster now if (teleportToClosestSpawnpoint) { Transform target = NetworkManagerMMO.GetNearestStartPosition(player.transform.position); player.UCE_Warp(target.position); } else { teleportationTarget.OnTeleport(player); } } } }
string UpdateServer_DEAD(Player player) { // events sorted by priority (e.g. target doesn't matter if we died) if (EventRespawn(player)) { // revive to closest spawn, with 50% health, then go to idle Transform start = NetworkManagerMMO.GetNearestStartPosition(player.transform.position); player.movement.Warp(start.position); // recommended over transform.position player.Revive(0.5f); return("IDLE"); } if (EventMoveStart(player)) { // if a player gets killed while sliding down a slope or while in // the air then he might continue to move after dead. it's fine as // long as we don't allow client input to control the move. return("DEAD"); } if (EventMoveEnd(player)) { } // don't care if (EventSkillFinished(player)) { } // don't care if (EventDied(player)) { } // don't care if (EventCancelAction(player)) { } // don't care if (EventTradeStarted(player)) { } // don't care if (EventTradeDone(player)) { } // don't care if (EventCraftingStarted(player)) { } // don't care if (EventCraftingDone(player)) { } // don't care if (EventTargetDisappeared(player)) { } // don't care if (EventTargetDied(player)) { } // don't care if (EventSkillRequest(player)) { } // don't care return("DEAD"); // nothing interesting happened }
// ----------------------------------------------------------------------------------- // // ----------------------------------------------------------------------------------- public override void Apply(Entity caster, int skillLevel) { // apply only to alive people if (caster.isAlive) { // -- Determine Teleportation Target if (teleportToClosestSpawnpoint) { Transform target = NetworkManagerMMO.GetNearestStartPosition(caster.transform.position); ((Player)caster).UCE_Warp(target.position); } else { teleportationTarget.OnTeleport((Player)caster); } } }
// ----------------------------------------------------------------------------------- // Apply // ----------------------------------------------------------------------------------- public override void Apply(Entity caster, int skillLevel) { foreach (string member in ((Player)caster).party.members) { Player player = UCE_Tools.FindOnlinePlayerByName(member); // -- Teleport everybody but not the caster if (player != null && player != (Player)caster) { // -- Check Distance if (maxDistanceToCaster <= 0 || Utils.ClosestDistance(caster, caster.target) <= maxDistanceToCaster || member == ((Player)caster).party.master) { // -- Determine Teleportation Target if (teleportToClosestSpawnpoint) { Transform target = NetworkManagerMMO.GetNearestStartPosition(player.transform.position); player.UCE_Warp(target.position); } else { teleportationTarget.OnTeleport(player); } } player = null; } } // -- Teleport the caster now if (teleportToClosestSpawnpoint) { Transform target = NetworkManagerMMO.GetNearestStartPosition(((Player)caster).transform.position); ((Player)caster).UCE_Warp(target.position); } else { teleportationTarget.OnTeleport(((Player)caster)); } }
public GameObject CharacterLoad(string characterName, List <Player> prefabs, bool isPreview) { List <List <object> > table = ExecuteReader("SELECT * FROM characters WHERE name=@name AND deleted=0", new SqliteParameter("@name", characterName)); if (table.Count == 1) { List <object> mainrow = table[0]; // instantiate based on the class name string className = (string)mainrow[2]; Player prefab = prefabs.Find(p => p.name == className); if (prefab != null) { GameObject go = Instantiate(prefab.gameObject); Player player = go.GetComponent <Player>(); Debug.Log("读取到的存档中数据数量:" + mainrow.Count); player.name = (string)mainrow[0]; player.account = (string)mainrow[1]; player.className = (string)mainrow[2]; float x = (float)mainrow[3]; float y = (float)mainrow[4]; player.level = Convert.ToInt32((long)mainrow[5]); float health = (long)mainrow[6]; float mind = (long)mainrow[7]; float power = (long)mainrow[8]; player.healthAdditional = Convert.ToInt32((long)mainrow[9]); player.mindAdditional = Convert.ToInt32((long)mainrow[10]); player.powerAdditional = Convert.ToInt32((long)mainrow[11]); player.strengthAdditional = Convert.ToInt32((long)mainrow[12]); player.defenseAdditional = Convert.ToInt32((long)mainrow[13]); player.runSpeedMultipleAdditional = Convert.ToInt32((long)mainrow[14]); player.intelligenceAdditional = Convert.ToInt32((long)mainrow[15]); player.Experience = (long)mainrow[16]; player.skillExperience = (long)mainrow[17]; player.Money = (long)mainrow[18]; player.coins = (long)mainrow[19]; // try to warp to loaded position. // => agent.warp is recommended over transform.position and // avoids all kinds of weird bugs // => warping might fail if we changed the world since last save // so we reset to start position if not on navmesh Vector2 position = new Vector2(x, y); player.agent.Warp(position); if (!player.agent.isOnNavMesh) { Transform start = NetworkManagerMMO.GetNearestStartPosition(position); player.agent.Warp(start.position); // no need to show the message all the time. it would spam // the server logs too much. //Debug.Log(player.name + " invalid position was reset"); } LoadInventory(player); LoadEquipment(player); LoadSkills(player); LoadBuffs(player); LoadQuests(player); LoadGuildOnDemand(player); // assign health / mana after max values were fully loaded // (they depend on equipment, buffs, etc.) player.Health = health; player.Mind = mind; player.Power = power; // set 'online' directly. otherwise it would only be set during // the next CharacterSave() call, which might take 5-10 minutes. // => don't set it when loading previews though. only when // really joining the world (hence setOnline flag) if (!isPreview) { ExecuteNonQuery("UPDATE characters SET online=1, lastsaved=@lastsaved WHERE name=@name", new SqliteParameter("@name", characterName), new SqliteParameter("@lastsaved", DateTime.UtcNow)); } return(go); } else { Debug.LogError("no prefab found for class: " + className); } } return(null); }
public GameObject CharacterLoad(string characterName, List <Player> prefabs, bool isPreview) { var row = ExecuteDataRowMySql("SELECT * FROM characters WHERE name=@name AND deleted=0", new SqlParameter("@name", characterName)); if (row != null) { // instantiate based on the class name string className = (string)row["classname"]; var prefab = prefabs.Find(p => p.name == className); if (prefab != null) { var go = Instantiate(prefab.gameObject); var player = go.GetComponent <Player>(); player.name = (string)row["name"]; player.account = (string)row["account"]; player.className = className; float x = (float)row["x"]; float y = (float)row["y"]; float z = (float)row["z"]; Vector3 position = new Vector3(x, y, z); player.level = Mathf.Min((int)row["level"], player.maxLevel); int health = (int)row["health"]; int mana = (int)row["mana"]; player.strength = (int)row["strength"]; player.intelligence = (int)row["intelligence"]; player.experience = (long)row["experience"]; player.skillExperience = (long)row["skillExperience"]; player.gold = (long)row["gold"]; player.coins = (long)row["coins"]; // is the position on a navmesh? // it might not be if we changed the terrain, or if the player // logged out in an instanced dungeon that doesn't exist anymore if (NavMesh.SamplePosition(position, out NavMeshHit hit, 0.1f, NavMesh.AllAreas)) { // warp is recommended over transform.position and // avoids all kinds of weird bugs player.Warp(position); } // otherwise warp to start position else { Transform start = NetworkManagerMMO.GetNearestStartPosition(position); player.Warp(start.position); // no need to show the message all the time. it would spam // the server logs too much. //Debug.Log(player.name + " spawn position reset because it's not on a NavMesh anymore. This can happen if the player previously logged out in an instance or if the Terrain was changed."); } LoadInventory(player); LoadEquipment(player); LoadSkills(player); LoadBuffs(player); LoadQuests(player); LoadGuildOnDemand(player); // assign health / mana after max values were fully loaded // (they depend on equipment, buffs, etc.) player.health = health; player.mana = mana; // set 'online' directly. otherwise it would only be set during // the next CharacterSave() call, which might take 5-10 minutes. // => don't set it when loading previews though. only when // really joining the world (hence setOnline flag) if (!isPreview) { ExecuteNonQueryMySql("UPDATE characters SET online=1, lastsaved=@lastsaved WHERE name=@name", new SqlParameter("@lastsaved", DateTime.UtcNow), new SqlParameter("@name", characterName)); } // addon system hooks Utils.InvokeMany(typeof(Database), this, "CharacterLoad_", player); return(go); } Debug.LogError("no prefab found for class: " + className); }
// ----------------------------------------------------------------------------------- // CharacterLoad // ----------------------------------------------------------------------------------- public GameObject CharacterLoad(string characterName, List <Player> prefabs, bool isPreview) { var row = ExecuteDataRowMySql("SELECT * FROM characters WHERE name=@name AND deleted=0", new SqlParameter("@name", characterName)); if (row != null) { string className = (string)row["class"]; var prefab = prefabs.Find(p => p.name == className); if (prefab != null) { GameObject go = GameObject.Instantiate(prefab.gameObject); Player player = go.GetComponent <Player>(); player.name = (string)row["name"]; player.account = (string)row["account"]; player.className = (string)row["class"]; float x = (float)row["x"]; float y = (float)row["y"]; float z = (float)row["z"]; Vector3 position = new Vector3(x, y, z); player.level = (int)row["level"]; int health = (int)row["health"]; int mana = (int)row["mana"]; player.strength = (int)row["strength"]; player.intelligence = (int)row["intelligence"]; player.experience = (long)row["experience"]; player.skillExperience = (long)row["skillExperience"]; player.gold = (long)row["gold"]; player.coins = (long)row["coins"]; player.agent.Warp(position); if (!player.agent.isOnNavMesh) { Transform start = NetworkManagerMMO.GetNearestStartPosition(position); player.agent.Warp(start.position); } LoadEquipment(player); LoadInventory(player); LoadSkills(player); LoadBuffs(player); #if !_iMMOQUESTS LoadQuests(player); #endif LoadGuildOnDemand(player); player.health = health; player.mana = mana; if (!isPreview) { ExecuteNonQueryMySql("UPDATE characters SET online=1, lastsaved=@lastsaved WHERE name=@name", new SqlParameter("@name", characterName), new SqlParameter("@lastsaved", DateTime.UtcNow)); } Utils.InvokeMany(typeof(Database), this, "CharacterLoad_", player); return(go); } } return(null); }
public GameObject CharacterLoad(string characterName, List <Player> prefabs, bool isPreview) { characters row = connection.FindWithQuery <characters>("SELECT * FROM characters WHERE name=? AND deleted=0", characterName); if (row != null) { // instantiate based on the class name Player prefab = prefabs.Find(p => p.name == row.classname); if (prefab != null) { GameObject go = Instantiate(prefab.gameObject); Player player = go.GetComponent <Player>(); player.name = row.name; player.account = row.account; player.className = row.classname; Vector3 position = new Vector3(row.x, row.y, row.z); player.level.current = Mathf.Min(row.level, player.level.max); // limit to max level in case we changed it player.strength.value = row.strength; player.intelligence.value = row.intelligence; player.experience.current = row.experience; ((PlayerSkills)player.skills).skillExperience = row.skillExperience; player.gold = row.gold; player.isGameMaster = row.gamemaster; player.itemMall.coins = row.coins; // can the player's movement type spawn on the saved position? // it might not be if we changed the terrain, or if the player // logged out in an instanced dungeon that doesn't exist anymore // * NavMesh movement need to check if on NavMesh // * CharacterController movement need to check if on a Mesh if (player.movement.IsValidSpawnPoint(position)) { // agent.warp is recommended over transform.position and // avoids all kinds of weird bugs player.movement.Warp(position); } // otherwise warp to start position else { Transform start = NetworkManagerMMO.GetNearestStartPosition(position); player.movement.Warp(start.position); // no need to show the message all the time. it would spam // the server logs too much. //Debug.Log(player.name + " spawn position reset because it's not on a NavMesh anymore. This can happen if the player previously logged out in an instance or if the Terrain was changed."); } LoadInventory(player.inventory); LoadEquipment((PlayerEquipment)player.equipment); LoadItemCooldowns(player); LoadSkills((PlayerSkills)player.skills); LoadBuffs((PlayerSkills)player.skills); LoadQuests(player.quests); LoadGuildOnDemand(player.guild); // assign health / mana after max values were fully loaded // (they depend on equipment, buffs, etc.) player.health.current = row.health; player.mana.current = row.mana; // set 'online' directly. otherwise it would only be set during // the next CharacterSave() call, which might take 5-10 minutes. // => don't set it when loading previews though. only when // really joining the world (hence setOnline flag) if (!isPreview) { connection.Execute("UPDATE characters SET online=1, lastsaved=? WHERE name=?", DateTime.UtcNow, characterName); } // addon system hooks onCharacterLoad.Invoke(player); return(go); } else { Debug.LogError("no prefab found for class: " + row.classname); } } return(null); }
public static GameObject CharacterLoad(string characterName, List <Player> prefabs) { List <List <object> > table = ExecuteReader("SELECT * FROM characters WHERE name=@name AND deleted=0", new SqliteParameter("@name", characterName)); if (table.Count == 1) { List <object> mainrow = table[0]; // instantiate based on the class name string className = (string)mainrow[2]; Player prefab = prefabs.Find(p => p.name == className); if (prefab != null) { GameObject go = GameObject.Instantiate(prefab.gameObject); Player player = go.GetComponent <Player>(); player.name = (string)mainrow[0]; player.account = (string)mainrow[1]; player.className = (string)mainrow[2]; float x = (float)mainrow[3]; float y = (float)mainrow[4]; float z = (float)mainrow[5]; Vector3 position = new Vector3(x, y, z); player.level = Convert.ToInt32((long)mainrow[6]); int health = Convert.ToInt32((long)mainrow[7]); int mana = Convert.ToInt32((long)mainrow[8]); player.strength = Convert.ToInt32((long)mainrow[9]); player.intelligence = Convert.ToInt32((long)mainrow[10]); player.experience = (long)mainrow[11]; player.skillExperience = (long)mainrow[12]; player.gold = (long)mainrow[13]; player.coins = (long)mainrow[14]; // is the position on a navmesh? // it might not be if we changed the terrain, or if the player // logged out in an instanced dungeon that doesn't exist anymore NavMeshHit hit; if (NavMesh.SamplePosition(position, out hit, 0.1f, NavMesh.AllAreas)) { // agent.warp is recommended over transform.position and // avoids all kinds of weird bugs player.agent.Warp(position); } // otherwise warp to start position else { Transform start = NetworkManagerMMO.GetNearestStartPosition(position); player.agent.Warp(start.position); // no need to show the message all the time. it would spam // the server logs too much. //Debug.Log(player.name + " spawn position reset because it's not on a NavMesh anymore. This can happen if the player previously logged out in an instance or if the Terrain was changed."); } LoadInventory(player); LoadEquipment(player); LoadSkills(player); LoadBuffs(player); LoadQuests(player); LoadGuild(player); // assign health / mana after max values were fully loaded // (they depend on equipment, buffs, etc.) player.health = health; player.mana = mana; // addon system hooks Utils.InvokeMany(typeof(Database), null, "CharacterLoad_", player); return(go); } else { Debug.LogError("no prefab found for class: " + className); } } return(null); }