Example #1
0
    // -----------------------------------------------------------------------------------
    // 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);
            }
        }
    }
Example #2
0
    // -----------------------------------------------------------------------------------
    // 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);
                }
            }
        }
    }
Example #3
0
    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
    }
Example #4
0
 // -----------------------------------------------------------------------------------
 //
 // -----------------------------------------------------------------------------------
 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);
        }
Example #7
0
    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);
    }
Example #9
0
    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);
    }
Example #10
0
    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);
    }