Search Unity

  1. Unity 2019.1 is now released.
    Dismiss Notice

uMMORPG Official Thread

Discussion in 'Assets and Asset Store' started by vis2k, Dec 29, 2015.

  1. vis2k

    vis2k

    Joined:
    Sep 4, 2015
    Posts:
    3,141
    uMMORPG.png
    uMMORPG is now on the Asset Store and makes your Unity MMORPG a reality!
    (Store) (WebGL) (Chat) (FAQ) (Showcase) (Documentation)

    All the architecture was designed with simplicity in mind. The code is as short and as simple as possible - this is the only way for an Indie MMORPG to succeed.

    Screenshots:
    initial.png
    initial6_PVE.png
    initial5_UI_b.png
    mobile3.png

    Features:
    * Fully Unity + Mirror based, no other tools needed
    * Same Scripts for Client & Server
    * Uses Unity's new UI system
    * Players, Monsters, NPCs
    * Warrior & Archer Classes
    * Pets
    * Skinned Mesh Equipment
    * WSAD & Click movement via Navigation
    * Animations via Mecanim
    * Beautiful 3D Character and Environment Models
    * Local, Whisper, Info Chat
    * Minimap
    * Levels
    * STR & INT Attributes
    * Skills, Buffs & Skillbar, AoE Skills
    * Items, Gold & Trash
    * Item Drops & Looting
    * Crafting
    * Pets & Customizable Behaviour
    * Guild System & Ranks
    * Party System & Exp. / Gold Sharing
    * Item Mall
    * Player to Player Trading
    * NPC Trading & Quests
    * PvP Murder System
    * Tab Targeting
    * Death and Respawning
    * SQLite Database
    * Account System
    * Only 4000 lines of carefully crafted C# Code
    * Secure: all Logic is simulated on the Server
    * Server can run on Linux in Headless mode
    * MMO Camera with Zoom, Rotation, Linecasting
    * Login, Character Selection, Character Creation
    * Networkmanager to start Host/Client/Dedicated
    * Network Time Synchronization
    * Platform Independent: works where UNET works
    * Mobile Support
    * Free of Deadlocks & Race Conditions
    * Documentation with Tutorials & Addons

    If anyone has a question or suggestions, feel free to post here or email info[at]noobtuts.com. I will try to keep this top post updated all the time.

    Roadmap:
    • V1.0 [released 2015-12-23]
      • First release with a whole lot of features already.
    • V1.1 [released 2016-01-05]
      • Fixed: entering an invalid name causes Disconnect
      • Entity Damage Popups are now optional
      • Updated Documentation
    • V1.2 [released 2016-01-08]
      • NetworkManager SavePlayerForConnection function added
      • Fixed a bug where Chat input couldn't be submitted on Mac
      • Added an IsValidAccount function as template so that people can easier find the place where account validation can be modified
      • Used Application.loadedLevelName instead of SceneManager again for downwards compatibility to Unity 5.2
      • Fixed a bug where the Player Database wasn't saved after closing the Editor in Windows 8.1 and Windows 10
      • Fixed a bug where a Client couldn't connect again without restarting the game after disconnecting once
      • Changed Player Settings so that WebGL Builds work without the crashes that were caused by UNET
      • Automatically start Dedicated Server if in Headless Mode
      • Renamed DatabaseItem/Skill/Quest to Item/Skill/QuestTemplate because it makes more sense
      • Fixed a bug where the target indicator wasn't destroyed after disconnecting
    • V1.3 [released 2016-01-13]
      • Added STR & INT Attributes
      • Renamed folder "Database" to "ScriptableObjects"
      • Renamed "Prefabs/Items" folder to "Prefabs/ItemModels"
      • Character Info Window (and removed character stats from Equipment Window)
      • Slot Types are now shown in the Equipment Window next to the slots
      • Loot Window won't be shown anymore if the Monster didn't drop anything
      • Changed Character Database from ScriptableObject to XML in order to make it work in Builds too
      • Fixed a bug where right clicking an equipment item in the inventory would cause "Command called on Server" error when trying to equip it
      • Added IsValidAccount MYSQL example in comments
      • Added IsValidAccount HTTP-GET+PHP Script example in comments
    • V1.4 [released 2016-01-21]
      • Headless server can now handle 1000 monsters instead of only 50:
        • added LayerMasks to ignore Monster<->Monster collisions, Npc<->Npc collisions, Player<->Player collisions etc.
        • Dedicated Servers also don't show Entity Animations anymore.
        • [Tested on Intel i5-4430 CPU and Linux Mint; the headless server uses 100% of one CPU core and only 209MB of RAM. 1000 Monsters are starting to cause minor delays in the Client.]
      • Renamed PlayerSkill to Skill and PlayerQuest to Quest because the UNET bug that appeared after renaming them seems to be gone in 5.3.1f1.
      • UNET Server Hosting Tutorial
      • Database now saves and loads Quests too
        • Note: delete current Database folder before using new version
      • Fixed NetworkNavMeshAgent agent.destination==pos comparison bug where the agent's baseOffset was missing in the calculation
      • Refactored Character Selection method: it now uses ClientScene.AddPlayer + NetworkManager.OnServerAddPlayer instead of a custom message handler, as suggested in the UNET forums. This also avoids the "playerController higher than expected: 0: warning.
    • V1.5 [released 2016-01-30]
      • Note: make sure to delete the old Database folder because CharacterData has changed
      • Used UI instead of OnGUI and removed 500 Lines of OnGUI Code
      • Added [TextArea] attribute to Items, Skills and Quests for easier editing in the Inspector
      • Renamed PlayerSkill.cs file to Skill.cs
      • Moved IsHeadless detection from LoginMask to NetworkManager
      • Fixed a bug where Skillbar Hotkeys were checked for all players and not just for the local Player
      • Added string.ToInt() extension method
      • Player Skills are now all in one list instead of using a Learned and Learnable list
      • Workaround for a UNET bug where skills/quests wouldn't be synchronized to clients if we loaded them before the AddPlayerForConnection call
      • Moved all Player logic into the Player class and all Player UI updates into another class for simplicity
      • Simplified NPC Quest/Trade window logic by using two NPCs and getting rid of the initial NPC dialog
      • Removed NetworkManager prefab because it's in the Hierarchy at all times anyway
      • String IsNullOrWhitespace is now a static method instead of an extension, because it wouldn't be able to detect 'null' on a string that is 'null' if it's an extension
      • Removed 2 unnecessary client variables in NetworkManager message sending
      • Added Player quest limit to avoid database size exploits etc.
      • Set 'Trees' Layer to 'default'
      • CmdNavigateTo now checks if the Player is alive before navigating somewhere (dead players now can't walk anymore if they were to send a navigation package to the server)
      • Loading a Player with 0 HP now also sets the initial state to "DEAD"
      • Fixed "Command function CmdCancelAction called on server." by creating a CancelAction function that can be called on the server without any errors.
      • Simplified Skill logic by replacing the 'lastCasted' variable with 'cooldownEnd' and 'casttimeEnd'. This makes cooldown/casttime remaining calculations and database saving/loading much easier and allows for skills to be canceled without starting the cooldown.
      • Simplified Monster skill cast logic by replacing the 'lastCasted' variable with 'castTimeEnd'.
      • CancelAction improved: it now stops movement or cast first and only clears the target when pressed again
      • NetworkManager save interval decreased from 5 minutes to 1 minute
      • NetworkManager OnDestroy now doesn't try to save the host character anymore because it only worked sometimes anyway; it also fixes a skill saving bug where Time.time was '0' already it in OnDestroy, causing skills to be saved with high cooldowns.
      • Increased WebGL memory size to 512MB
    • V1.6 [released 2016-02-03]
      • Chat shows Debug Log again in Development Builds
      • Added some NetworkManager 'not in game world yet?' checks for Character Selection & Deletion
      • Renamed NetworkManagerCustom to NetworkManagerMMO
      • NetworkManager.OnClientDisconnect now shows a Popup so that the user knows what happened
      • NetworkManager.IsConnecting() function added
      • LoginMask buttons are not interactable while connecting
      • ClientRpc UNET documentation was misleading, which caused some Chat messages to be sent to the wrong people. Fixed it and reported it here: http://forum.unity3d.com/threads/suggestion-globalrpc-observerrpc-targetrpc.382486/
      • Character Creation now checks if the name already exists in any account's characters, not just the creator's account's characters
      • Converted all Texture Compression to "Truecolor" in order to avoid the WebGL Black Texture bug
      • Slightly adjusted the ground color to make it more blue
      • Added NetworkProximity component to Damage Popups, now they are only shown to observers that are very close (instead of being shown to everyone)
      • Player.TryCastSkill now checks if the skill is ready before casting it. This fixes a bug 'autorepeat' skills would skip cooldowns.
      • Monsters don't try to move to a killed target after it respawns anymore.
      • Changed "skillCur != -1" checks to "0 <= skillCur < skills.Count" check for additional safety
    • V1.7 [released 2016-02-13]
      • Npc Dialogue reimplemented and NpcMerchant/NpcQuestgiver logic merged into Npc class again
      • Player to Player trading
        • Note: the trade button can be found under the target panel and it's clickable if the players are standing close enough together
      • Renamed Camera Script to "CameraMMO" for consistency
      • Added 'state' validation to all Commands
      • Renamed Skill.cs file to BuggySkill.cs as a workaround to the following bug: http://forum.unity3d.com/threads/bug-syncliststruct-only-works-with-some-file-names.384582/
    • V1.8 [released 2016-02-18]
      • Note: make sure to delete the old Database folder because the XML structure has changed a bit.
      • Rewrote XML database code from scratch. Everything is much simpler now and there is no more need for an extra CharacterData class. This also improves the NetworkManager's database handling code a lot. The Database code is now short, elegant and a really good solution.
      • Simplified Entity, Monster, Npc, Player: all property functions like GetHp(), IncreaseHp(), DecreaseHp() were replaced with public properties (C#'s get{ } set{ } construct)
        • This saves lots of code and makes development much easier, because something like player.IncreaseHp(1); is now as simple as ++player.hp;
      • Simplified Player experience increasing algorithm
      • NetworkManager now checks account name max length and valid characters
      • NetworkManager OnServerAddPlayer: removed unnecessary go.SetActive(true) call
      • Renamed item/skill/quest ExistsInDB function to TemplateExists
      • Loot window doesn't show up and close immediately anymore when trying to loot a dead monster that has no loot.
      • Removed unused trashIcon property in Player Script.
      • Upgrade to Unity 5.3.2f1
    • V1.9 [released 2016-03-01]
      • Note: make sure to delete the old Database or add a "<class>Warrior</class>" node to each saved character.
      • Upgraded to Unity 5.3.3 for UNET fixes.
      • Player class selection in Character Creation.
      • Added an 'Archer' class
        • Model with Animations
        • Bow and Arrow
        • Ranged Skills that work for Arrows, but also for magical skills like fireballs.
      • Damage Popups are now only instantiated on clients and not on the server anymore (for performance)
        • Removed NetworkDestroyAfter and NetworkTextMesh Scripts.
        • Damage Popups are now Instantiated at the Entity's center (not at the feet anymore)
      • Added Entity/Npcs,Monsters,Players folder and renamed default player to Warrior
      • Entity now has a damage popup height offset property, so that the popups aren't shown at the entity's feet anymore.
      • Circle Indicator's up Vector is now set to the RaycastHit's normal Vector so that the indicator is also properly rotated on terrains that are not just flat.
      • Replaced character model's eyebrow white color with a texture.
      • Re-enabled Skeleton name overlay.
      • Player's account property is now hidden in inspector.
      • Fixed Dark Sword and Desert Cleaver sell price so that it's always lower than the buy price.
      • Added Item Template price validation to make sure that the sell price is never higher than the buy price.
      • Changed Warrior's weapon slot type to 'EquipWeaponSword' to prevent it from equipping a bow.
      • Adjusted Warrior Animation Controller Attack-simple exit time to the animation duration.
      • Removed unused 'Effect' variable from SkillTemplate and Skill.
      • Added transform.FindRecursively extension method.
      • Changed the function Entity.DealDamage to Entity.DealDamageAt and implemented a modified version for the Player, so that it grants him experience after killing a monster (which was done in TryCasting before)
      • Adjusted NameOverlay Y position from 2.5 to 2.3.
      • Added a NetworkProximityChecker custom Script that detects the pelvis collider, so that entities don't need a placeholder collider for proximity to work.
      • Changed Alchemist tag from Monster to Npc.
      • A monster's AggroArea GameObject is now the last in the hierarchy, so that GetComponentInChildren<Collider>() always returns the pelvis collider and not the AggroArea's collider.
      • Can't put an item into an equipment slot of type "" anymore.
      • Disabled Tree GameObject's Terrain Collider for performance.
      • Changed shortcut menu order.
      • Replaced NameOverlay script with more general FaceCamera and TextMeshCopyName components.
      • Replaced DamagePopup script with more general FaceCamera and DefaultVelocity components.
        • DamagePopup now uses a Rigidbody instead of transform.position to move upwards.
      • Removed unused UniqueID script.
      • Changed NetworkManager's second channel to 'Reliable Sequenced' in order to avoid some 'Did not find target for sync message' warnings.
      • Added Monster 'followDist' property to follow targets further than the movement radius (important for ranged attackers).
      • Players now automatically pull aggro when attacking a Monster to make sure that Archers also pull aggro.
    • V1.10 [released 2016-03-05]
      • Monster OnAggro now has a [ServerCallback] attribute instead of a isServer check
      • Removed unused ParticleSystemDestroyer Script from Standard Assets folder.
      • Replaced 'transform.' with cached 'tr.' in all Entity Scripts for performance.
      • Added SyncList.FindIndex extension method and used it in Player Script to shorten code.
      • Added more How-To's to the Documentation.
      • Fixed a bug where the player's start position could only be set within some weird boundary because transform.position was used to set the initial position instead of agent.Warp.
      • Added workaround to a reintroduced UNET bug (http://forum.unity3d.com/threads/bug-old-synclist-callback-bug-was-reintroduced-to-5-3-3f1.388637/) by updating 3D equipment all the time instead of using the callback. This will be reverted as soon as the UNET bug was fixed again.
      • Changed Bow and Arrow shader to 'Cutout' so that the feather is transparent and not surrounded by a yellow color.
      • Slightly adjusted the Floor color.
      • Added SetListener extension to replace the RemoveAllListeners() + AddListener() calls when refreshing the UI.
      • Updated uMMORPG icons.
      • Removed 'Linux graphics glitches' bug from the list because it is fixed in Unity 5.3.3.
    • V1.11 [released 2016-03-10]
      • Removed each Entity's RotationFix child object and properly rotated all the models now.
      • Can't attack monsters without a weapon anymore (fixes a NullReferenceException when trying to attack a monster without a bow as an archer)
      • Removed unnecessary target=null clearing in Monster's and Player's death event checks and did it all in one place now.
      • Fixed a bug where a player would still move to his destination even if he was killed while moving.
      • ShowPopup messages now accumulate if a message has to be shown while the Popup window already shows one.
      • Fixed a bug where Skills with cooldowns weren't automatically repeatable.
      • Added ConsoleGUI component that shows a little console at the top of the Screen in case of errors and warnings, because Unity's DevelopmentConsole only works in development builds, but people should see errors in all builds.
      • Renamed NetworkManagerMMO custom OnClientError function to OnClientReceivePopup for consistency.
    • V1.12 [released 2016-03-28]
      • Upgraded to Unity 5.3.4f1 for more UNET fixes.
      • Improved the issue #774970 workaround to also update weapon models on dedicated servers and avoid a null reference exception when firing arrows
    • V1.13 [released 2016-04-06]
      • Added Patcher part to Documentation
      • Login with invalid Account or too long account also causes Disconnect now
      • NetworkNavMeshAgent Teleport detection improved to fix a bug where other player's wouldn't teleport after respawning
      • Entity now caches NetworkIdentity
      • Only update Entities that have observers (saves 30% of the CPU usage when using lots of monsters)
      • Mobile Support
        • Database now works on Mobile
        • Android settings adjusted (Landscape, load indicator, bundle identifier, quality settings)
        • Added a Chat Send button for Mobile support
    • V1.14 [released 2016-04-11]
      • Note: delete the old Database or add <buffTimeEnd>0</buffTimeEnd> to each character.
      • Added Buffs (see the Warrior's Health Aura skill)
      • AggroArea and OnAggro now work with the 'Entity' type instead of the 'Monster'/'Player' types. This is useful for cases where other Entities (like NPCs) need Aggro Areas.
      • Smaller Syntax improvements
    • V1.15 [released 2016-04-18]
      • All Distance Calculations now use Utils.ClosestDistance function, which uses a point on the collider that is closest to the other entity, instead of using the center. This solves the problem where big boss monsters wouldn't be attackable if their radius would be bigger than their or their attacker's attack range.
      • Shortcut menu now toggles the Windows instead of only opening them.
      • Worked around bug #788203 where WebGL builds failed when inheriting from NetworkProximityChecker. We now use a NetworkProximityFix script to work around it, hence WebGL builds work again.
      • Enable Code Stripping and .Net Subset in WebGL settings again because the bug that prevented us from doing that seems to be fixed in 5.3.4f1.
    • V1.16 [released 2016-04-21]
      • Login mask and character selection quit buttons are now handled in the UI script
      • Newly created players now spawn with full health and mana
      • Monster loot gold is now a SyncVar (fixes a bug where clients wouldn't see it)
      • lootItems.Clear is now called before hiding entities to work around UNET bug #788537 (loot works fine in clients now)
      • Replaced all TextMeshes with UI text (more modern, not visible through walls)
      • Fixed a bug where a second quest couldn't be accepted if the first one wasn't finished yet
    • V1.17 [released 2016-04-25]
      • PvP Murder System
      • Dead players can't be healed anymore
      • Dead players can't buff themselves anymore
      • NPC dialogue is now automatically closed when running out of the talk range
      • Entity.Recover is now virtual so that it can be overwritten
      • Buffs can now heal/drain health and mana percentage per second
      • Player canAttackPlayers flag to enable/disable PvP
      • Player DealDamageAt now passed 'entity' instead of 'target' parameter to base function
      • Skill time is now displayed in a prettier way (1d 2h 3m 4s)
    • V1.18 [released 2016-04-27]
      • Renamed Quest.cs file to BuggyQuest.cs to work around UNET bug #737241
    • V1.19 [released 2016-05-13]
      • Workaround for WebGL scroll sensitivity bug #79326. WebGL build zoom speed is better now.
      • Added a Login Cancel button to stop login attempts that may take a long time.
      • Fixed a few typos and missing words in comments.
    • V1.20 [released 2016-05-19]
      • Monster now uses 'deathTimeEnd' and 'RespawnTimeEnd' instead of increasing a 'timeElapsed' counter to make sure that monsters that haven't been updated in a while will immediately respawn if they are updated again after a long time.
    • V1.21 [released 2016-05-24]
      • NPC Dialogue buttons are now in a scroll view, so that any amount of buttons is supported.
      • NPC Dialogue Teleport option.
    • V1.22 [released 2016-06-07]
      • Note: please upgrade your Unity to version 5.3.5!
      • Upgraded to Unity 5.3.5 for important bug fixes
        • Removed Equipment Callback bug workaround because SyncList hooks are now called at the right time again.
        • Using NetworkProximityCheckerCustom again because the IL2CPP WebGL build bug was fixed.
      • Added a note to ScriptableObjects folders where it's important that all of them are in the same folder.
      • Improved chat scrolling after a new message was received so that it always scrolls to the bottom now.
      • Can't attack self anymore.
      • Updated documentation.
    • V1.23 [released 2016-06-13]
      • Area of Effect Skills
      • Added more how-to's to the documentation
      • Added Monster.HasLoot() function that checks loot gold and loot items properly.
        • Loot window is now properly shown and hidden if the monster has or has no loot.
    • V1.24 [released 2016-06-07]
      • WSAD Movement
      • Projectiles (Arrows) now adjust their rotation in Start already, so that they don't spawn with weird rotations.
      • Using SceneManager instead of Application.loadedLevel now
    • V1.25 [released 2016-06-21]
      • Note: database skill saving and loading changed, so please delete your previous database or modify existing ones to the new scheme. Also make sure to redo all properties for your skills.
      • Skill Upgrades
      • Removed redundant TextCopyName script that accidentally wasn't removed when renaming it to UITextCopyName a while ago.
      • Added 'How to keep track of uMMORPG changes in detail' to documentation.
      • Utils.PrettyTime doesn't return an empty string for '0' anymore. Fixes an issue where Normal Attack skills without cooldowns would show empty strings in the cooldown description.
      • UI SkillSlots used in the skill list now have a minimum width and height. Fixes an issue where some skill icons would be squeezed together if the description text was too wide.
      • Fixed an issue where equipment tooltips could still be shown after dragging an item out of the equipment slot.
      • Added a missing target null check in Player.UpdateCasting.
    • V1.26 [released 2016-06-25]
      • Monsters now only switch their target if the new target is at least 20% closer. Avoids cases where monsters would nervously switch between two targets that are about equally far away.
      • Item-, Skill- and Quest templates are now loaded via Resources.LoadAll to make sure that those that aren't referenced by anyone in the scene are still loaded. This is important in cases where certain items may not be dropped anymore after an event, but should still be loadable for the player's inventories.
      • Skill.autorepeat is now skill.followupDefaultAttack. This can be set to true so that the character keeps attacking with the default attack (the first skill in the list) after casting a skill on a target. This makes combat much more pleasant, because the character wont' just stop fighting after casting a skill.
      • UpdateCasting is now canceled when trying to cast an attack skill on a target that disappeared or died.
        • Note: the skill animation might still keep playing to the end. I am currently researching the best way to stop that too.
    • V1.27 [released 2016-07-01]
      • Simplified the Player skill system and moved it to Entity.cs so that Player, Monster and Npc can make use of it.
        • Monster skills can now be created in the project area, just like with players
        • Note: they only use the first skill in the list for now
        • Entity.cs now has 'CastCheckSelf', 'CastCheckTarget' and 'CastCheckDistance' functions to check all skill cast requirements. And it has a 'CastSkill' function to apply the skill. Monster and Player state machines take care of waiting for the cast time, just like before. But the weird TryCastSkill function and the weird UpdateCasting code are now gone.
      • Player and Monster attack animations now has the correct exit time in the controller (didn't use a normalized time before, but Unity wants a normalized time)
      • Simplified Player and Monster animator parameters to only use skillCur instead of triggers. Also makes parameter passing in Player.LateUpdate easier
      • Player and Monster Skill canceling now works in any case and also stops the animation properly
      • Player.CancelAction now also clears 'skillNext'
      • Simplified Player.CancelAction state checks
      • Don't allow WSAD movement while the chat input is selected
      • Clear indicator circle when starting WSAD movement.
      • Renamed Player.HasEquipmentWeapon to HasCastWeapon and moved it to Entity.cs
      • Monster.OnAggro check now uses Entity.CanAttackType since it's there anyway
      • Added missing 'else' in an 'else if' clause in Player.UpdateMoving
      • Monster now uses RemainingDistance instead of Speed as animation parameter, just like the Player
      • Monsters now really clear the target if it died, so that they don't walk to Players anymore after they respawned.
      • Manually placed trees instead of using SpeedTree and LOD, saving 400k polygons.
    • V1.28 [released 2016-07-05]
      • Monster now has a distance check before trying to cast a spell on a target in the aggro radius
      • Player and Monster buffs are now stopped upon death in OnDeath
      • Monsters now move into skill cast range * 0.8 again
      • Monsters and Players now use the 'speed' parameter instead of 'RemainingDistance' parameter for the movement animation. Also added a comment to explain why this is the only working option
        • Also fixes the 'sliding' issue when using WSAD movement for vertical movement.
      • Added additional 'move to start if target is not in follow distance' checks to monster state machine
    • V1.29 [released 2016-07-18]
      • Deterministic finite state machine
        • Redesigned the state machine completely
        • All events are now handled in every state. This avoids all kinds of weird situations.
        • It is much cleaner and easier to read now.
        • Fixes several smaller state issues like 'monster still walks to the player after respawning', etc.
        • The state can now only be set in the state update functions (via return) and nowhere else. This means that we have all state changes where they should be now.
        • Entity state updates now work without SendMessage, which should have a decent performance impact.
      • Using 'skillCur = skillNext = -1' to clear skillCur and skillNext now, because it's shorter.
      • Updated documentation (Entity.cs now has a new comment that explains the state machine).
      • Added 'targetNext' similar to 'skillNext', which is set when trying to change a target while casting a skill on the current target. It is only changed after the cast is finished.
      • Player.IsTradeOfferStillValid now uses Linq's .All method and is a one liner.
      • Player to Player trading code simplified.
    • V1.30 [released 2016-07-22]
      • Tooltips for Quests, Items and Skills reimplemented.
        • The code is much simpler and the tooltip text can be set in the Inspector. The code simply replaces the variables like {DAMAGE} in the tooltip text.
        • Not all items have to have the same tooltip now. Health potions can simply contain the amount healed, they don't need to show that they do 0 damage etc.
        • All tooltip code was moved out of SkillTemplate/QuestTemplate/ItemTemplate and into Skill/Quest/Item for consistency.
        • Also improved the murderer and offender tooltips.
      • Skill constructor time code syntax improved.
      • Extensions import syntax improved.
      • ConsoleGUI syntax improved by moving the #if #endif macro around Awake.
      • CopyPosition simplified and syntax improved.
      • Database inventory and equipment item loading syntax simplified.
      • Entity doesn't require an animator component anymore. Players and monsters do now. This is for cases where Entities don't have animations (towers, dummies, etc.).
      • Entity doesn't cache transform component as 'tr' anymore for easier readability and shorter code.
      • Entity.IsMoving syntax improved.
      • Entity.OnAggro syntax improved.
      • Entity.CastCheckTarget syntax improved.
      • NetworkManagerMMOUI.IsLocalPlayerInWorld syntax improved to a one liner.
    • V1.31 [released 2016-08-08]
      • Upgraded to Unity 5.3.6
      • Monsters, Npcs, Players now have a slightly bigger collider for easier click targeting
      • UIRefresh checks skill.IsReady before sending Cmd
    • V1.32 [released 2016-08-15]
      • Fixed UIRefresh.UpdateSkillbar bug where 'i' was used instead of 'skillIndex' when accessing the player's skills
      • Downgrade to Unity 5.3.5 to avoid UNET reconnect bug that happens in 5.3.6
    • V1.33 [released 2016-08-22]
      • UI is now component based (attached to each UI element) instead of keeping everything inUIRefresh and NetworkManagerUI scripts
      • UI slots for inventory, equipment, quests, skills, etc. are now dynamically instantiated/destroyed to match the slot amount
      • All UI panels now have scrollbars to work with any amount of slots for inventory, quests, skills, etc.
      • Equipment category overlays are now automatically extracted from the equipment category, e.g. "EquipmentWeaponBow" overlay is "Bow"
      • Fixed a bug where all character selection buttons were disabled when reaching the character limit. Instead, the character creation button is now disabled when reaching the character limit.
      • UI Color(0,0,0,0) replaced with Color.clear for cleaner code
      • Monster: only fire respawn event if 'respawn' is true
    • V1.34 [released 2016-09-07]
      • Upgraded to Unity 5.4
      • Renamed Chat.ChatAddMessage to Chat.AddMessage
      • Renamed ChatEntry prefab to SlotChat
      • Fixed <= usage for skillindex <= skill.sCount instead of < skills.Count in Monster and Player scripts
      • Added active checks to UILogin and UICharacterCreation to only update when necessary
      • UIMinimap: removed unnecessary GetComponent<Text>() call when accessing levelName
      • NPC Dialogue is now only updated while the panel is active
      • CastCheckTarget now sets target to self first if needed for heals, buffs, etc. and player sets targetNext=target before calling CastCheckTarget. This is a very elegant solution to enforce the right target and then jump back to the previous one after the skill cast was finished.
      • Damage Popups improved and feel better now
        • The are TextMeshes instead of UI Texts again to avoid the Unity 5.4 Destroy Canvas crash
        • Red, italic font
        • Shadow effect
        • Fading
        • Velocity decreased slightly
        • They spawn on top of the entity now
      • NameOverlays are TextMeshes again to avoid Canvas Destroy crash in Unity 5.4
      • UIShortcuts tooltips added
      • UIEquipment parse last noun algorithm moved to Utils
      • Utils.IsCursorOverUserInterface checks UI and OnGUI now
      • Camera doesn't zoom in when scrolling in the Inspector anymore (thanks to 5.4)
      • Entity.hp and Entity.mp never return anything bigger than hpMax or MpMax to avoid cases where HpPercentage would return values bigger than one after a buff anded.
      • PlayerDndHandling switched split and merge comments, which where the wrong way around
      • PlayerDndHandling is not a NetworkBehaviour anymore and is UI/OnGUI independent now. Also modified UIDragAndDropable to work with the new one.
      • Moved all UI scripts into a UI folder for consistency
      • Moved Utils.BalancePrefabs function to UIUtils for consistency
      • ConsoleGUI renamed to GUIConsole and moved into OnGUI folder for consistency
      • Improved tooltip readability by using a darker navy tone background color
      • NPC Quest dialogue now shows the active quest status if the quest was accepted before. This makes sure that the 0/0 Monsters killed status is the up to date one.
      • NPC Trading UI sell slot now has a valid check to avoid possible issues where the item might disappear from the inventory but would still be shown in the sell slot.
    • V1.35 [released 2016-09-12]
      • Adjusted Damage Popup shadow size to original size
      • UIUtils.AnyInputActive helper function
      • Properly deselect Chat so it doesn't scroll or reactivate when doing WSAD movement afterwards
      • NPC can have multiple quests now
      • NPC only shows the quests that are available for the player's level
      • Made quest UI wider
      • Quests can now have 'gather item' requirements
      • startpos renamed to Spawn
      • NetworkNavMeshAgent adjustments to avoid bug #786248 in any case
      • UISkills sets entry.name to real skill list index now to avoid Drag and Drop issues when skills where added to the skill template list after status effects
    • V1.36 [released 2016-09-23]
      • Upgraded to Unity 5.4.1p1 to avoid UNET bugs
      • Damage Popup RPC is sent to attacker instead of target to avoid cases where it may not reach the target if it died
      • SyncList hook bug workaround implemented again
      • UI hotkeys for inventory, equipment, skills, quests, character info windows
      • Skillbar hotkeys have any-input-active check now
      • Moved character create function from NetworkManager to Database
      • Spawn has a Gizmo now for better visibility in the scene view
    • V1.37 [released 2016-10-13]
      • Upgraded to Unity 5.4.1p2 to avoid UNET bugs
      • New feature: quests have a 'completed' flag now and are stored in the player's quest list forever, so that they are not repeatable anymore
        • This was the first huge quest improvement. There are more to come after testing this one for a while.
      • UI Login position rounded
      • Entity.DealDamageAt now calls OnAggro in any case, instead of only calling OnAggro if a Player attacks a Monster
      • Skillbar, Inventory, Equipment Slot sizes aren't hardcoded anymore and stretch to the GridLayout's size instead
      • NetworkManager SavePlayers is now invoked in OnStartServer and canceled in OnStopServer, so that SavePlayers is not called on clients anymore
      • Monster OnDrawGizmos pos renamed to startHelp for clarity
      • NetworkManager OnServerDisconnect player controller finding simplified and index is not hardcoded anymore
      • NetworkManager OnApplicationQuit sends a StopClient packet to the server now, so that clients are logged out immediately and to avoid the UNET timeout OnDisconnectError bug where possible.
      • Quests.IsFinished renamed to IsFulfilled for clarity
    • V1.38 [released 2016-10-18]
      • QuestTemplate uses [Header] now for clarity
      • ItemTemplate uses [Header] now for clarity
      • SkillTemplate uses [Header] now for clarity
      • Player.CanStartQuest helper function
      • Player.CmdCompleteQuest extra check added to make sure that completed quest can't be completed again
      • Preceding quests implemented
      • NPC has a "?" Quest Indicator for new quests above it's head
      • NPC has a "!" Quest Indicator for fulfilled quests above it's head
      • Player.hpmax, mpmax, expmax, basedamage, basedefense are now all in one Player.levels array so that level dependent settings are more clear and easier to modify
      • Player.levelMax property removed because levels.Length is enough
    • V1.39 [released 2016-10-25]
      • SpeedTree: removed unused trees, decreased texture sizes to shrink project size from 54 to 12 MB. Useful when releasing a Unity MMORPG.
      • PlayerChat.CmdWhisper syntax: added missing space in foreach loop
      • NavMeshAgent SendInterval changed from 0 to 9999 for clarity
      • UI Login: TextName, TextPass, TextHeader, TextStatus RaycastTarget disabled so that the buttons are easily clickable even if one of the Texts overlaps them
      • UI Login: TextStatus anchored at the bottom for easier resizing
      • Documentation: added Technology Overview and added a beginner's exercise
      • Removed unnecessary [Server] tag from Entity.OnStartServer
      • Removed unnecessary [Server] tag from Monster.OnStartServer
      • Removed unnecessary [Server] tag from Npc.OnStartServer
      • UIUtils is just a default class now and doesn't inherit from MonoBehaviour anymore
    • V1.40 [released 2016-11-09]
      • UIUtils.AnyInputActive performance improved: doesn't use FindObjectsOfType workaround anymore.
      • NavMesh Voxel Size set to 0.3 to greatly reduce path calculation costs and NavMesh size from 462KB to 156KB.
    • V1.41 [released 2016-11-16]
      • Upgraded to Unity 5.4.2p3 for UNET bug fixes
      • Reverted NetworkNavMeshAgent sendInterval change to 0 again
      • Item usage checks item.minLevel now too
      • Fixed missing item.valid check in UILoot so that monsters can have more than one item of the same type
    • V1.42 [released 2016-11-28]
      • Upgraded to Unity 5.4.3 for UNET bug fixes
      • Fixed some typos in the documentation
      • Removed unnecessary character name saving in XML files since the filename is already the character's name
      • PlayerChat whisper to and from nowuses TargetRpc instead of manually sending a network message
      • PlayerChat info message now uses TargetRpc instead of manually sending a network message
      • Archer, Warrior, Skeleton, Alchemist prefabs now have a "3D Model" child object that contains all the model parts for easier modifications
      • EquipmentLocation check is now done via .StartsWith so that for example EquipmentWeaponBlade and EquipmentWeaponSword are both shown in the EquipmentWeapon location
      • Added a step by step guide on how to change entities to the documentation
      • Workaround for UNET OnDestroy isLocalPlayer bug so that Skillbar saving works again
      • Added new video to Asset Store page
    • V1.43 [released 2016-12-03]
      • Upgrade note: for each monster prefab, make sure to drag the monster itself into its AggroArea's owner property. For each player prefab, make sure to move the PlayerNameColor script from the Player to the Player's name overlay TextMesh and drag the Player into the owner property. Also make sure to reassign the DamagePopup shadow TextMeshCopyText.source property to the main TextMesh.
      • InventoryCanAddAmount helper function that checks existing stacks too
      • InventoryAddAmount helper function that adds to existing stacks first
      • Npc Trading adds purchased items to existing stacks first now
      • Looting adds items to existing stacks first now
      • Item, Quest, Skill now have a .template property in case it's needed somewhere
      • Quest syntax improved: some getters had a 3 space indentation instead of 4 spaces
      • Quest item rewards
      • Monster syntax improved: removed an empty line between Damage and Defense properties
      • Player.CmdNpcTeleport syntax improved: removed an empty line
      • Player.CmdNpcBuyItem simplified by not using a 'npc' helper variable anymore
      • Updated Monster.lootItems comment
      • Added 'how to add more player levels' to the documentation
      • Player syntax improved: removed empty line between Loot and Quests
      • Simplified AggroArea with a serialized owner slot instead of finding it in Awake.
      • SkillTemplate.dict lambda: 'item' renamed to 'skill'
      • ItemTempalte, SkillTemplate, QuestTemplate use the '??' operator for easier cache initialization now
      • NetworkTime.time property added for easier server time calculation
      • Skill cooldown/buff time/cast time calculations use NetworkTime.time now instead of manually calculating it.
      • Skill syntax simplified: using '0' instead of '0f'
      • Database.CharacterExists simplified: it's now 2 lines instead of 3 lines
      • Database.CharactersForAccount simplified: shorter syntax and using .Select instead of 'from ... select'
      • Database.CharacterSave simplified: XmlWriterSettings intialization via object initializers
      • Database.CharacterLoad simplified: XmlReaderSettings initialization via object initializers and improved reader indentation
      • Database.CharacterCreate inventory and equipment slot initialization simplified via ternary operator
      • EntityTargetSync.OnSerialize simplified via ternary operator
      • Extensions.FindRecursively simplified by using Array.Find instead of searching manually
      • Extensions.FindObserver syntax improved
      • NetworkNavMeshAgent.OnDeserialize indentation improved
      • NpcQuestIndicator.Update simplified and less computations in some cases
      • PlayerChat.OnSubmit syntax simplified
      • PlayerNameColor component is now attached to the TextMesh instead of the player and uses far less GetComponent/InChildren calls
      • Projectile syntax simplified: uses '1' instead of '1f' now
      • QuestTemplate 'General' header added above tooltip
      • PlayerNameColor requires TextMesh component now
      • NpcQuestIndicator requires TextMesh component now
      • TextMeshCopyName uses [SerializeField] instead of 'public' now
      • TextMeshCopyText target renamed to source for consistency
      • Utils.AnyKeyUp and AnyKeyDown use Linq.Any extension now
      • Utils.ClosestDistance simplified
      • Utils.GetAxisRawScrollUniversal uses '1' instead of '1f' now
      • GUIConsole '#if !UNITY_EDITOR' contains the whole class now
      • Monster.HasLoot simplified: uses 1 line instead of 4 lines now
      • Player.lootRange and talkRange use '4' instead of '4f' now
      • Player.cmdEvents HashSet is properly initialized with <string> instead of <String> now
      • UIDragAndDropable syntax improved
    • V1.44 [released 2016-12-07]
      • Upgraded to Unity 5.4.3p1 for the UNET WebGL fix. Make sure to adjust your animation controllers to the latest version and import all attack animations with 'Loop Time' enabled too.
      • Damage Block Chance for Items, Skills and Entities
      • Critical Damage Chance for Items, Skills and Entities
      • DamagePopup Shadow Z coordinate changed to 0.02 to fix rare cases where the shadow would appear in front of the main text
      • Changed experience bar color to a more violet tone
      • Skeleton reward experience decreased to 8 so that first kill doesn't immediately level up the player
      • UI Login panel now shows the uMMORPG logo
      • UI Login name and pass inputs positions adjusted so that they aren't blurry anymore
      • UI Character Creation dropdown label adjusted so it's not blurry anymore
      • NameOverlay and QuestIndicator TextMeshes are a higher resolution, hence more sharp now
      • NetworkMessage: all messages are now public so that they can easily be used from other scripts too
      • Character selection now knows the name and the player prefab for that class, instead of just the name
      • Character selection shows a little bow/shield icon depending on the class
      • Entity.animator caching to avoid GetComponent<Animator> calls in Player and Monster LateUpdate
      • Monsters and Player pass states directly to the state machine now, to fix all kinds of animation glitches and make them 100% exact
      • UI Chat, Skillbar, Minimap, Health & Mana, Experience Bar and Shortcuts now have empty parents
      • UI Chat, Skillbar, Minimap, Health & Mana, Experience Bar and Shortcuts are now hidden while logging in
    • V1.45 [released 2016-12-15]
      • UIChat.AutoScroll uses the most efficient scrolling method now
      • UIChat has a 'keepHistory' property now to only keep a certain amount of messages
      • WSAD movement reimplemented. Uses at max 6KB/s instead of 25KB/s now. Uses almost no bandwidth unless when rapidly changing directions now.
      • Added 'How to change the Login Scene' to the documentation
      • Quest.rewardGold and rewardExp are now 'long' too
      • Item.buyPrice and sellPrice are now long too
      • 'var' isn't used for simple types like int, string, float, bool anymore. This improves the readability and prepares for a future type optimization update.
      • Fixed monster nervously switching targets when they were both at roughly the same distance
      • Player.RefreshLocation GameObject 'g' renamed to 'go' for consistency
      • UIChat.AddMessage GameObject 'g' renamed to 'go' for consistency
    • V1.46 [released 2016-12-10]
      • Upgraded to Unity 5.5.0p1 for important bug fixes.
      • Improved Documentation
      • Skill.buffsHpPerSecond and buffsMpPerSecond are now values like 0.1 = 10% instead of 10 = 10%.
      • Utils.ClampLong renamed to Clamp for consistency
      • Utils.MaxLong/MinLong replaced with System.Math.Min/Max
      • Fixed Player and Npc slightly floating above the ground by modifying NavMeshAgent.baseOffset
      • UITarget syntax improved
      • Fixed a typo in Player.cs comments
      • Entity.Update clears the target if it's hidden now. Fixes issues where a player would retarget a monster after it respawned
      • Entity now uses [SyncVar] for the target. EntityTargetSync Script is not needed anymore and was removed.
      • Entity._state, _target, _hp, _mp aren't explicitly set as 'private' anymore
      • Added 'using UnityEngine.AI' in all Script that use the NavMeshAgent for 5.5
      • Splash screen animation set to static
      • BuggyQuest renamed to Quest because the bug was finally fixed by Unity
      • BuggySkill renamed to Skill because the bug was finally fixe by Unity
    • V1.47 [released 2016-12-25]
      • NavMeshAgent.NearestValidDestination extensions added (used for WSAD movement)
      • UIDragAndDropable syntax improved
      • Object Initializers are used for network messages for simplicity
      • NetworkManager.IsValidAccount parameters renamed to not collide with member variables
      • Network Configuration optimizations for Unity MMORPGs:
        • Max Buffered Packets
        • Min Update Timeout
        • Reactor Max Receive/Send Messages
        • Second channel changed to 'Unreliable Fragmented' for less important things
        • Projectile uses Channel 0 again
        • NetworkName uses Unreliable channel
        • NetworkNavMeshAgent uses Unreliable channel
        • Channels.DefaultUnreliable/DefaultReliable constants are used instead of hardcoding the channel indices
      • Player Drag and Drop: unsellable items can't be dragged into the NpcSell slot anymore
      • Player Drag and Drop: OnDragAndClear clears NpcSellSlot now too
      • UINpcTrading: sell slot tooltip is now hidden when there is no item in the slot
      • UINpcDialogue: opening the Buy / Sell menu also opens the player's inventory now
      • Utils 'using' statements sorted a bit better
    • V1.48 [released 2016-12-29]
      • All Player commands now use the unreliable channel (except CmdSetTarget)
      • PlayerChat now uses the unreliable channel
      • All PlayerChat commands now use the unreliable channel
      • PlayerChat TargetRPCs and ClientRPCs use the unreliable channel now
      • Entity.RpcShowDamagePopup uses unreliable channel now
      • NetworkManager.OnValidate checks configured channels
      • Item.tradable property
      • Added 'Template/Addon/Plugin/Mod Systems' part to the documentation
      • Removed some comments from UIChat
      • #ifdef checks added around 'using UnityEngine.AI' to avoid issues for people that didn't upgrade to Unity 5.5 yet.
    • V1.49 [released 2017-01-03]
      • Upgraded to Unity 5.5.0p3 for important bug fixes.
      • Disabled campfire particle subemitters to avoid memory leak
      • Normal quality texture compression is now used for all textures instead of uncompressed mode. Reduces WebGL size from 19 to 14MB and OSX Standalone build size from 97 to 62MB.
      • Dedicated server / headless mode fixed tick rate for maximum CCU
      • Arrow model texture moved into material folder
      • Box model texture moved into material folder
    • V1.50 [released 2017-01-10]
      • Upgrade Info: Player and Monster animation controllers have changed a bit, make sure to adjust it in your own MMO project too.
      • Player moving state: if casting is canceled because of a dead target, it will remain in the MOVING state instead of going back to IDLE while actually moving
      • Player.SelectionHandling refactored. It uses CanAttackType instead of type checking the entity manually and is better structured
      • Player.SelectionHandling click movement uses agent.NearestValidDestination extension now too, which fixes some glitches when trying to move into an unreachable area
      • Monster, Player animation controllers IDLE parameter removed, because it can be indirectly derived from !MOVING, !CASTING, !DEAD.
      • Player and Monster only play the moving animation if agent.velocity != zero. Fixes some movement glitches where the animation might be delayed due to latency or where it started too early while the path was still pending
      • Player.LoadSkillbar loads learned skills if no skillbar was saved before. This greatly improves the first experience for a new player
      • NetworkNavMeshAgent warp detection to avoid issues where the agent would try to walk to a place that the server actually warped it too, e.g. when sliding to the respawn point
    • V1.51 [released 2017-01-14]
      • Added new Temple 3D model
      • Restructured Scene
      • Campfire particle position adjusted a bit
    • V1.52 [released 2017-01-20]
      • "Teleport to: to the Woods": removed duplicate "to"
      • Documentation updated: added XML and PHP account registration community plugin links
      • Removed unnecessary word in CameraMMO comment
      • UICharacterCreation DropDown index != -1 check added
      • Server list feature added
      • IsNullOrWhitespace comment typo fixed
      • NetworkManager.IsValidAccount moved to Database for consistency
      • IsValidAccount valid path check added to avoid forbidden names like 'CON' in Windows
    • V1.53 [released 2017-01-20]
      • Crafting
      • UICharacterCreation dropdownCurrent variable renamed to currentClass for consistency
      • Player.CmdTradeOfferAccept 'else' syntax simplified
    • V1.54 [released 2017-01-25]
      • NetworkManager OnClientConnect Unity 5.2 bug workaround removed because it's been a while now
      • NetworkManager SavePlayers simplified via LINQ from-where-select
      • NetworkManager CharacterDelete prints character name in log instead of just printing the index. This is useful for MMOs in production.
      • NavMeshAgent.NearestValidDestination extension improved: fixed an issue with positions that are not on a NavMesh; returns agent position in case of failure now.
      • Monster random movement uses Random.insideUnitCircle now. Allows us to remove Utils.RandVec3XZ function and makes sure that the monster stays inside the radius (RandVec3XZwasn't normalized before)
      V1.55 [released 2017-01-27]
      • Updated to Unity 5.5.1 for important bug fixes.
      • Upgrade info: make sure to set Edit->Project Settings->Player API compatibility level to '.NET' instead of '.NET subset'
      • SQLite Database to prepare for item mall / cms / instances support
      • Database.CharacterCreate function is no longer needed. We won't have to Instantiate+Destroy a temporary gameobject anymore.
      • Database shadow delete: deleted characters can be restored by setting deleted=0 in the database
      • Account system that automatically creates an account when first logging in or compares the password if the account already exists
      • Player.OnDestroy isLocalPlayer workaround removed because the UNET bug was fixed
      • Updated documentation
      • UICharacterSelection createButton.interactable isn't set inside the for loop anymore
      • UIPopup text color set to black for readability
    • V1.56 [released 2017-02-01]
      • sqlite3.dll plugin collision on Windows Editor fixed
    • V1.57 [released 2017-02-02]
      • NetworkManagerMMO: PBKDF2 Password hashing
      • Database.SaveMany: removed the Debug.Log message
      • Monster UpdateServer_IDLE: randomly generated 3D point uses y=0 again because it's added to start.y. Avoids issues where monsters wouldn't walk on some terrain.
      • NetworkManagerMMO: Database header comment removed
      • NetworkManagerMMO.OnValidate now shows a warning if someone tries to modify the IP and port directly instead of using the server list.
    • V1.58 [released 2017-02-04]
      • All ServerList servers use the same port from the NetworkManager now, so that a headless server knows which port to bind to
    • V1.59 [released 2017-02-07]
      • libsqlite3.so compiled for Sqlite Android support
      • Tab Targeting
    • V1.60 [released 2017-02-09]
      • Item Mall
      • Database constructor simplified: uses CREATE TABLE IF NOT EXISTS now. Simplifies code and makes it more robust for cases where a table may have been deleted.
      • Added 'How to use the Item Mall' to the Documentation
    • V1.61 [released 2017-02-10]
      • Database.ExecuteNonQuery/Scalar/Reader uses 'new SqliteCommand(sql, conn)' now for simplicity and compatibility with MYSQL
      • Database.CharactersForAccount query uses 'FROM' instead of 'from' for consistency
      • Database Constructor: table creation uses tables and field names without '' now for compatibility with MYSQL
    • V1.62 [released 2017-02-15]
      • Upgrade Info: make sure to add all the new UI Slot scripts to the UI Slot prefabs and assign their properties to each prefab's components. Drag the prefab into the scene if needed. Also make sure to check each UI Script in the Scene and drag in all the necessary components again because some variables changed to a more literal version, like 'cancelButton' instead of 'btnCancel'.
      • Utils.PrettyTime uses milliseconds too if needed
      • Player script: simplified some array initializers
      • GUIConsole LogType.text renamed to .message
      • UIBuffs simplified
      • UICharacterCreation simplified
      • UICharacterInfo simplified
      • UICharacterSelection simplified
      • UIChat simplified
      • UICrafting simplified
      • UIDragAndDropable simplified
      • UIEquipment simplified
      • UIExperienceBar simplified
      • UIHealthMana simplified
      • UIInventory simplified
      • UIItemMall simplified
      • UIKeepInScreen simplified
      • UILogin simplified
      • UILoot simplified
      • UIMinimap simplified
      • UINpcDialogue simplified
      • UINpcQuest simplified
      • UIPlayerTradeRequest simplified
      • UIPlayerTrading simplified
      • UIQuests simplified
      • UIRespawn simplified
      • UISkillbar simplified
      • UISkills simplified
      • UITarget simplified
      • UINpcTrading simplified
    • V1.63 [released 2017-02-22]
      • Upgrade Info: delete the old database file. Adjust item, quest, skill tooltips where necessary because {HEALSHP} changed to {HEALSHEALTH} etc. Rename Player/Monster/Npc animation controller 'skillCur' parameter to 'currentSkill'
      • CameraMMO mobile controls improved: two finger pinching, 45 degree fixed angle
      • Utils.IsPointerOverGameObject now works on mobile too. Mobile can't click through UI anymore
      • NetworkManagerMMO.OnValidate: 'use server list' message is now shown directly in the NetworkManager ip field to make it more obvious
      • Utils.PrettyTime renamed to PrettySeconds for clarity
      • CameraMMO syntax simplified
      • Database simplified: more literal variable names; some database fields renamed (hp to health etc.)
      • Extensions.NearestValidDestination syntax improved
      • NetworkNavMeshAgent variables renamed to something more literal (last => lastDestination etc.)
      • NetworkManagerMMO variables renamed to something more literal
      • Quest, QuestTemplate: variables renamed to something more literal
      • PlayerChat: using 'string' instead of 'var' for some variables
      • PlayerChat uses variables renamed to something more literal and other smaller improvements
      • Skill, SkillTemplate, UISkills variables renamed to something more literal
      • Item, ItemTemplate, UIItem variables renamed to something more literal
      • Entity, Player, Monster, Npc variables renamed to something more literal
      • Player.PlayerLevel struct is now a class; renamed unnecessary constructor
    • V1.64 [released 2017-03-02]
      • Coupon time delay to avoid brute force
      • UIDragAndDropable variable renamed to someting more literal
      • Player.OnStartLocalPlayer unnecessary isLocalPlayer check removed
      • Removed all [FormerlySerializedAs] tags
      • PlayerChat.OnStartLocalPlayer [Client] tag removed
      • PlayerEquipmentLocation renamed to EquipmentLocation because it's more universal and to prepare for addon system
      • Player .healthMax, .manaMax etc. equipBonus variable renamed to equipmentBonus, attrBonus to attributeBonus
      • Player.SelectionHandling bestDest renamed to bestDestination
      • Player.lootRange and talkRange replaced by interactionRange to prepare for addons
      • Canvas Loot gold tooltip disabled
    • V1.65 [released 2017-03-07]
      • Player.WSADHandling dest renamed to destination, bestDest renamed to bestDestination
      • PlayerChat renamed to Chat to prepare for addon system
      • Database.CharacterSave version with extra parameters removed to prepare for addon system
      • Player.CmdUnlockItem syntax improved
      • Database.CharacterLoad 'var' replaced with 'float' for coordinates
      • NetworkNavMeshAgent safeguard added to avoid UNET's ReadString out of range bug
      • Player.CmdTakeLootItem: added missing item.valid check to avoid duping
      • Entity.CanAttackType parameter t renamed to type
    • V1.66 [released 2017-03-30]
      • Player.experience recursion removed
      • PlayerDndHandling moved into Player class to prepare for addon system. Also improves performance by avoiding two FindObjectOfType calls.
      • Player indentation fixes
      • Item.Tooltip uses Stringbuilder for performance and to prepare for addon system
      • Skill.Tooltip uses Stringbuilder for performance and to prepare for addon system
      • Quest.Tooltip uses Stringbuilder for performance and to prepare for addon system
    • V1.67 [released 2017-04-06]
      • Upgrade Info: make sure to delete your old database file.
      • Guild System
      • UILogin dedicated button .interactable / onClick order switched
      • UILogin login button: fixed a bug where it could try to login twice when clicking it rapidly
      • Monster: Loot header is now shown in the Inspector again
      • Player: OnDragAndClear uses SendMessage to prepare for the addon system
    • V1.68 [released 2017-04-11]
      • Upgraded to Unity 5.6
      • Player.riskyActionTime; used for coupons and for other actions soon
      • Player.onlinePlayers dictionary
      • Chat, Database, NetworkManager, Player use onlinePlayers dictionary for performance
      • Fixed a bug where an empty guild message could be sent
      • Updated documentation
    • V1.69 [released 2017-04-18]
      • Downgraded to Unity 5.5 until UNET's OnDisconnect Timeout bug will be fixed
      • SyncVar limit workaround via [SyncVar_] custom attribute
      • Addon System implemented (see Addons/AddonExample.cs)
      • Player: converted some [SyncVar]s to [SyncVar_] to make room for Addon SyncLists
    • V1.70 [released 2017-04-26]
      • Player.OnLevelUp hook added for addons
      • Extensions.FindObserver removed, replaced with onlinePlayers[name] everywhere
      • Updated documentation
      • Camera yMin/MaxAngle renamed to xMin/MaxAngle
      • UI Scripts are now partial and provide Update hooks for addons
    • V1.71 [released 2017-04-29]
      • New Skill Effects system (replaces skill.projectile). Make sure to drag the new Arrow prefab into the Archer skills' effect prefab slot.
      • NetworkStartPositionForClass script that inherits from NetworkStartPosition and can be used to set the start position for a certain class.
      • Player respawns at the closest NetworkStartPosition instead of a random one
    • V1.72 [released 2017-05-02]
      • SyncVarLimitWorkaround synchronizes all values when starting once. Fixes a bug where a SyncVar_ wouldn't be synchronized if it was modified before Start
      • Fixed GetStartPositionFor index out of range issues if a NetworkStartPositionForClass playerPrefab was null
      • Renamed start positions in the scene to respawn positions for clarity
    • V1.73 [released 2017-05-10]
      • NetworkManagerMMO initialization moved from Awake to Start. Fixes the DontDestroyOnLoad warning
      • Changed AddonExample OnLevelUp [Client] attribute to [Server]
      • Fixed Standard Assets warning
      • Entity.CastSkill: mana is decreased in any case now, not for each category separately
      • Created separate floor material for easier Standard Assets upgrades
      • Player.LateUpdate syntax: missing space fixed
      • Archer Animation Controller: animation states renamed to proper skill names
      • Archer Animation Controller: added animation state for Blessing to fix a bug where the running animation would still be played when casting it while running
      • Warrior Animation Controller: animation states renamed to proper skill names
      • Warrior Animation Controller: added animation state for Health Aura to fix a bug where the running animation would still be played when casting it while running
      • Skeleton Animator: animation states renamed to proper skill names
    • V1.74 [released 2017-05-24]
      • New Skill Effects system
    • V1.75 [released 2017-05-31]
      • Player.classIcon property moved to the top next to className
      • Enabled 'loop pose' for Warrior, Skeleton, Archer IDLE and WALK animations to make them more smooth
    • V1.76 [released 2017-06-06]
      • Upgraded to Unity 5.6.1p1
      • Inventory and gold moved from Player to Entity. Monsters don't need lootItems and lootGold anymore. Commands also require less casting now.
      • health/manaRecoveryRate is now calculated with base + buffs in Entity. Removed Player.Recover and Addon System hook
      • Entity.invincible, healthRecovery, manaRecovery made public
      • Entity.invincible, healthRecovery, manaRecovery are not syncvars anymore
      • Entity.gold is a [SyncVar] instead of [SyncVar_] again
      • Player: converted all [SyncVar_]'s to [SyncVar] for elegance
      • Removed SyncWarLimitWorkaround script and linked to my forum post instead.
      • Monster loot.Clear workaround removed since the UNET bug was fixed a while ago
      • Player.GetSkillIndexByName moved to Entity
      • Entity.OnStartServer health==0 check comment updated
      • Changed [SerializeField] to 'public' almost everywhere
      • NetworkManager id/pw renamed to loginAccount and loginPassword. Same for LoginMsg.
      • Player.tradeOfferLocked/Accepted replaced with tradeStatus enum. Frees another SyncVar and makes the code more simple.
      • Entity components are now assigned in the Inspector instead of via GetComponent caching in Awake (Keep that in mind when updating)
      • Drag and Drop / Clear messages are now sent from UIDragAndDropable directly instead of from Player. This way UIDragAndDropable doesn't need to know the Player type anymore and the Player script is shorter.
      • UIDragAndDropable top comment updated
      • LoginMsg now also includes Application.version and the server compares it to avoid cases where an outdated version tries to communicate with a newer server, possibly causing networking errors.
    • V1.77 [released 2017-06-15]
      • NetworkManager: Max. Connections increased from 100 to 1000
      • NetworkManager GlobalConfig: ThreadPoolSize increased from 1 to 3, so that a uMMORPG server uses at least 4 threads now.
      • NetworkManager ConnectionConfig: increased Disconnect Timeout
      • NetworkManager ConnectionConfig: increased Connect Timeout
      • NetworkManager ConnectionConfig: increased Ping Interval
      • NetworkManager ConnectionConfig: increased Network Drop Threshold for better WiFi support
      • NetworkManager ConnectionConfig: increased Overflow Drop Threshold for better WiFi support
      • NetworkManager ConnectionConfig: increased Acks type to 128 to support more reliable messages
      • Guild Notice feature implemented
    • V1.78 [released 2017-06-28]
      • Project Settings: company name changed to new website: ummorpg.net
      • Removed mesh components from Blessing and Health Aura skill effects because the Particle System doesn't need them anymore
      • Entity, SkillEffectProjectile: replaced GetComponentInChildren<Collider> calls with .collider for performance and simplicity
      • NetworkNavMeshAgent.agent is now assigned in the Inspector instead of using GetComponent. Improves performance and simplicity.
      • NetworkNavMeshAgent pos renamed to position
      • Extensions: XML extensions removed because they aren't needed anymore
      • Removed unused 'using' statements in all files
      • Removed unnecessary trailing spaces in all Scripts
      • UIChat: removed unnecessary (GameObject) cast
      • UIDragAndDropable: removed unnecessary (GameObject) cast
      • UIShowTooltip: removed unnecessary (GameObject) cast
      • Database: removed unecessary (GameObject) cast
      • Entity: removed unnecessary (GameObject) cast
      • Chat: ParseGeneral function simplified
      • Entity, Npc, Player: 'System.type' changed to 'type'
      • Entity: InventorySlotsFree uses .Count instead of .Where.Count
      • NetworkManagerMMO: GetStartPositionFor uses ?? operator to simplify the return statement
      • NpcQuestIndicator: any call simplified
      • Player.RefreshLocation: removed unnecessary (GameObject) cast
      • Player.TradeOfferItemSlotAmount uses .Count instead of .Where.Count
      • Player.CmdTradeOfferAccept: TradeOfferItem loops use foreach now
      • SkillTemplate.levels syntax simplified
      • Utils.IsNullOrWhiteSpace simplified
    • V1.79 [released 2017-07-11]
      • EquipmentLocation script removed. Equipment locations are now set in the Player Script with the Inspector directly.
      • New Warrior model + new Equipment items
      • Skinned mesh equipping
      • Old warrior model is now a Bandit monster
      • Indicator size slightly increased to fit better around the new Warrior model
    • V1.80 [released 2017-07-14]
      • Upgraded to Unity 2017.1! Make sure to set your .NET Compatibility level to '.Net' instead of '.Net Subset' when upgrading your own project.
      • Regenerated SpeedTree materials to fix the warning when importing uMMORPG.
      • Murderer skill tooltip health buff percentage fixed
      • Chat: removed top comment about guild feature not being implemented yet
    • V1.81 [released 2017-07-25]
      • NetworkManagerMMO: headless check only starts a server if it wasn't started already
      • NetworkManagerMMO: OnClientSceneChanged overwritten with empty function to prepare for Network Zones
      • NetworkManagerMMO: OnServerDisconnect base function isn't called directly anymore to avoid the Debug.LogError that shows when a client disconnects
      • Database: added character 'online' field so that external applications can check if a character is currently online without talking to the server directly.
    • V1.82 [released 2017-07-26]
      • FaceCamera: only enabled while visible to improve performance with huge amounts of entities
      • NetworkProximityCheckerCustom: layer mask added to SphereCast to only check the Player layer. Greatly improves peformance with huge amounts of entities. Make sure to assign the correct layer in the Inspector when upgrading.
      • Physics Collision Matrix: IgnoreRaycast layer only collides with Player layer now to make sure that AggroAreas don't do any unnecessary casts. Greatly improves performance with huge amounts of entities too.
      • Entity.Update: moved check into separate IsWorthUpdating function.
      • Entity.IsWorthUpdating is used in Monster.LateUpdate to improve performance with huge amounts of entities.
      • Delete AggroArea layer because it's not used anymore
    • V1.83 [released 2017-08-04]
      • Upgraded to Unity 2017.1.0p2 for important UNET fixes
      • Entity Awake: removed outdated comment
      • Entity: added virtual Start function, Monster and Player use override for theirs
      • Entity.Start disables animator if isClient is false. Greatly increases server performance.
      • UIShowTooltip: always updates tooltip text to make sure that swapped out items' tooltips are shown immediately
      • Utils.GetMethodsByPrefix uses built-in KeyValuePair now. Removed Pair workaround
      • Player.CmdUseInventoryItem: added OnUseInventoryItem hook
    • V1.84 [released 2017-08-30]
      • Pathfinding Iterations per Frame increased from 100 to 5000. Now modifiable in a new component on the NetworkManager
      • Warrior base offset adjusted so that indicator is shown properly when selecting the warrior
      • Updated documentation
    • V1.85 [released 2017-09-12]
      • CopyPosition syntax improved
      • Name/Quest/Guild overlays are now updated from Entity/Player itself for simplicity and less GetComponent calls. Removed all the TextMesh update scripts. Make sure to reassign the TextMesh variables in your Entity prefabs when upgrading.
      • Database.SaveGuild missing @ parameter in front of character and rank fixed
      • Reimplemented Guild system
        • Moved most of it to Guild.cs
        • FindOnlineGuildMembers huge performance improvements
        • GuildInviteAccept has no more distance check
        • Notice is only sent when it was actually changed
        • Only the guild name is synced to all observers
        • Guild info is not synced to all observers anymore to greatly reduce bandwidth usage
        • Code is much cleaner
    • V1.86 [released 2017-09-20]
      • Upgraded to Unity 2017.1.1p1 for important bug fixes
      • Player: public Chat component to be assigned in the Inspector instead of GetComponent calls for performance
      • Chat: public Player component to be assigned in the Inspector instead of GetComponent calls for performance
      • Player CmdGuildInviteTarget: uses risky action to avoid spamming
      • Player CmdGuildInviteTarget: can't invite someone that's already in a guild
      • Player.FindOnlineGuildMembers function removed; Chat uses onlinePlayers directly for shorter code and better performance
      • Chat.CmdMsgGuild player.InGuild check added to avoid error when sending a guild message without being in a guild
    • V1.87 [released 2017-09-20]
      • Party System
      • Player.onlinePlayer works on the client now too (only contains the observers that are known on the client)
    • V1.88 [released 2017-10-02]
      • Downgraded to Unity 2017.1.0p1 to avoid spawn position bug
      • NetworkManager Awake hook changed to Start
      • Chat: Removed unnecessary comment
      • UIChat: AddMessage keepHistory checks deletes half the history each time to avoid Destroy lags
      • Monster OnAggro comment updated
      • Entity.CanAttackType changed to CanAttack(Entity) to prepare for future features
      • Entity.DealDamageAt: AoE damage checks CanAttack so that Npcs can't be attacked by AoE damage anymore
    • V1.89 [released 2017-10-10]
      • Note: make sure to use Unity 2017.1.0p1 to avoid a spawn position bug that would affect pets.
      • Monster: Added missing addon hooks for OnDeath, OnAggro, UpdateClient
      • Pet System
    • V1.90 [released 2017-10-11]
      • Monster, Npc default max. Mana set to 0
      • Database: invalid Player position causes reset to nearest spawn point now
      • Player Start: equipment isn't shown/instantiated/animated on the server anymore
    • V1.91 [released 2017-10-25]
      • Party HUD: fixed masking for large amounts of party members
      • Workaround for Unity 2017.2 UI bug #960900 to prepare for upgrade
    • V1.92 [released 2017-10-27]
      • Art Update
    • V1.93 [released 2017-11-02]
      • Pet: removed sync message warning
      • UI: changed all scroll views to clamped movement
      • UI: added viewport to skills scroll view
      • Entity.RpcShowDamagePopup improved: sends GameObject instead of position (4 instead of 12 bytes) and uses the prefab of the object that was attack now
    • V1.94 [released 2017-11-09]
      • BabySkeleton owner NameOverlay renamed to OwnerNameOverlay
      • Player.OnEquipmentChanged warning message removed
      • CameraMMO: view blocking enabled again but with 'nothing' Layer as default
      • NetworkTime: fixed a bug where the client's NetworkTime.time would get out of sync after the server experienced freezes
      • Pet can only be summoned if owner has at least the same level
      • Pet can only level-up up to owner's level so he can always summon it
      • Pet item tooltip shows required owner level
      • Player.OnDamageDealtToMonster rewards exp to player first, then to pet, to make sure that pet can level up immediately too if possible
      • NetworkManagerMMO.Quit: universal quit function implemented that works in Editor and in Builds
      • UILogin: quit button uses NetworkManagerMMO.Quit so that it works in Editor now too
      • UIShortcuts: quit button uses NetworkManagerMMO.Quit so that it works in Editor now too
    • V1.95 [released 2017-11-29]
      • NetworkManagerMMO.OnServerAddPlayer addon hook parameters added to prepare for a NetworkZones fix
    • V1.96 [released 2017-11-29]
      • Upgraded to Unity 2017.1.2p3 for important bug fixes (e.g. Fog shader bug with d3d9 error when building)
      • UICharacterInfo, UICrafting default hotkeys swapped
      • WSAD movement doesn't try to find a path behind a wall anymore (unlike click movement)
      • Fixed some NavMesh holes by smoothing out the terrain around them
      • Removed one unnecessary mountain peak model in the background
      • UnityVersionCheck component added to NetworkManager to notify people about the recommended Unity version for uMMORPG if they use a different one
    • V1.97 [released 2017-12-05]
      • Player.skillbar+skillbarHotkeys are now in one array of SkillbarEntry
      • Player.equipmentTypes+Locations+DefaultEquipment are now in one array of EquipmentInfo. Make sure to reassign the locations when upgrading!
      • Skill cast progress bar
      • Fixed missing Particle material for Blessing and Health Aura
      • Updated documentation
      • All Player/Monster/Npcs models reimported as Humanoid: able to retarget animations now
      • Stylistic fog removed and replaced with built-in Fog from Lighting settings
      • Precise Shot requires Skill Experience to learn now
    • V1.98 [released 2017-12-07]
      • Bandit: fixed strong hit animation (humanoid)
      • Monsters can use more than one skill now (the bandit already has two skills now)
      • Selection indicator is now projected onto the underground
      • Fixed lighting optimization/prefabs layers from 'npc' to default
      • Player.localPlayerClickThrough option implemented
      • Pet rotation fixed
    • V1.99 [released 2017-12-19]
      • Player.OnDragAndDrop_InventorySlot_InventorySlot uses configurable keys now; Utils.AnyKeyPressed added
      • Monster.OnAggro distance comparison doesn't happen for the same target anymore. This saves a LOT of computations when dealing with large amounts of monsters and players.
      • Database.CharacterSave saves status effect skills like murderer now too
      • Fixed UI Pet Revive Panel assignment which caused the internal panel to become invisible when walking away, instead of the window becoming invisible.
    • V1.100 [in development]
      • CopyPosition: syntax improved
      • NetworkManagerMMO: RegisterHandler calls moved to OnStartServer to fix a reconnect bug
      • NetworkMessages made partial so addons can extend them
      • Pet: EventOwnerDisappeared added to destroy self and avoid NullReferenceExceptions if the owner disconnected/disappeared before the pet was destroyed. Player OnDestroy also doesn't destroy the Pet anymore.
      • Player: initial equipment setup moved to OnStartClient to fix a bug where only the equipment would be shown around an invisible character in host mode if a player logged in outside of the local player's proximity
      • Player/Npc/Pet LateUpdate name overlay code: added null checks around ClientLocalPlayer call to fix a NullReferenceException when the host was in character selection while another client logged in (hence activated Npc Updates etc.)
    • V1.101 [released 2018-01-23]
      • Player.nextTarget is a SyncVar now
      • Player.UpdateServer_CASTING events all call UseNextTargetIfAny() before leaving to make sure that nextTarget is processed before leaving the state
      • UITarget shows nextTarget over target if any, so that players can switch targets (nextTargets to be exact) while casting a skill
      • Entity has .effectMount now to replace the old projectile's transform.FindRecursively call. Make sure to assign it to the right hand when upgrading.
      • Bandit's Strong Hit skill was renamed to "Secondary Attack(Bandit)" so it's less confusing
      • Animation controllers: 'currentSkill' parameter replaced with skill name boolean parameters for simplicity. Make sure to use the new controllers when upgrading.
      • Bandit, BabySkeleton both have their own animation controllers now
      • Entity.DealDamageAt AoE functionality removed to prepare for new skill system
    • V1.102 [released 2018-01-24]
      • Upgrade Info: this update is huge, it completely replaces the old skill system and entity properties. Please make a backup before upgrading since this will break all your old skills.
      • Scriptable Skills! Make sure to recreate your skills when upgrading, or use the new ones that come with uMMORPG.
      • SkillTemplate.predecessor for skill trees and skill requirements
      • SkillTemplate.requiresWeapon option
      • Skill levels via LevelBasedValues
      • Entity properties via LevelBasedValues (including Npc/Pet/Player/Monster). Make sure to resassign the values in the Inspector when upgrading your custom project.
      • Skills UI Window size increased
    • V1.103 [released 2018-02-08]
      • Updated documentation
      • Database.CharacterLoad health/mana are only assigned after maximum health and mana were fully loaded
      • Pet.CanAttack comment fixed
      • Player/Monster/Npc CanAttack uses 'entity is Type' instead of 'GetType' to work with inheriting classes too
      • Skill and Buff levels are saved and loaded in database again
      • Entity.OnDeath added and called by inheriting classes (Monster/Player/Pet) to save code
      • Skillbar cooldown circles
      • Skills list cooldown circles
      • Player.SelectionHandling: Raycast ignore self part moved to Utils
      • NetworkMessages: CharactersAvailableMsg now uses partial CharacterPreview structs and addon system can load additional values like player's health if needed in character selection UI
    • V1.104 [released 2018-02-09]
      • UI: removed all unnecessary content size fitters and layout groups from UI elements and prefabs (to improve performance)
      • Database: Load/Save Inventory/Equipment/Quests/Skills/... code moved into separate functions for simplicity
      • Database: items, skills, etc. tables use primary key combinations now to greatly improve performance from O(n) to O(log n)
      • Database: only valid items/equip/skills are saved and loaded now. Greatly improves performance and reduces storage space
      • Database: items/equipment/skills loading is now done with one query instead of one query per item/equipment/skill to greatly improve performance.
        • Benchmark: loading 1000 player inventories with 30 items each. Before: 2500ms; now: 70ms
      • UI Skillbar: fixed cooldown circle on items bug; SlotSkillbar prefab now has amount overlay too for items
      • UI Skills: scrollbar is now stretched completely to the bottom
      • Chat: UIChat component is now cached to avoid FindObjectOfType call for each new message
    • V1.105 [released 2018-02-21]
      • Item Mall items are now listed in Player.itemMallTemplates array instead of filtering the whole item list each time
        • Player.CmdUnlockItem sends just the index instead of the whole item name now to save a lot of bandwidth
        • CmdUnlockItem also doesn't access ItemTemplate.dict directly anymore, which makes for cleaner code
        • Different classes can see different item mall items now if needed
        • Make sure to drag all your item mall items into the player prefab when updating
      • UICharacterSelection quit button uses NetworkManagerMMO.Quit now too
      • Item: proxy syntax improved
      • Quest: proxy syntax improved
      • Database.LoadQuests doesn't add empty quest if template doesn't exist anymore
      • Chat: .chat FindObject call moved to Awake to avoid a new UNET bug where Rpcs are called on the host for other players
      • Item.DecreaseBy/IncreaseBy helper functions added to simplify amount decreasing + slot clearing in the rest of the code
      • SkillTemplate tooltip comment improved
      • SkillEffects now require NetworkProximityCheckers so they aren't seen by everyone on the server anymore
      • UICharacterSelection: select button can't be clicked twice anymore if the game is really slow and the user clicks really fast - as this would cause a 'playerController 0 already in use' error
    • V1.106 [released 2018-02-21]
      • Item/Skill/Quest/Buff structs use an int hash instead of a string name to reference the templates to greatly reduce bandwidth
      • Player.itemMallCategories array so that no more filtering/sorting is needed and to prepare for scriptable items
      • Pet unsummon via Pet UI instead of clicking the item again. Better usability and prepares for scriptable items.
    • V1.107 [released 2018-02-27]
      • Scriptable Items
        • Make sure to recreate your items when upgrading and compare your Player.equipmentInfo with the latest one (categories like 'Weapon' instead of 'EquipmentWeapon' etc.)
      • Monster Scroll example added (via Scriptable Items)
    • V1.108 [released 2018-03-02]
      • All ClientRpcs and TargetRpcs are now sent to the correct object on the correct connection
      • Entity RpcDamagePopup doesn't need damageReceiver parameter anymore
      • Reassigned offender and murderer buffs in player prefabs
      • Database SaveInventory/SaveEquipment: removed redundant item.valid checks
      • ItemSlot struct added so that Item struct's .amount can be moved to ItemSlot. This is very important for a cleaner, more logical architecture and to utilize Item.Equals.
      • Item.itemMallPrice wrapper added again
      • Entity InventoryCount/Remove/CanAdd -Amount renamed (removed 'Amount' suffix). They all use 'Item' instead of 'ItemTemplate' now to make use of Item.Equals to avoid cases where two pet items with different pet levels would be considered equal before.
      • BabySkeleton: max level increased to 10.
      • Player.CmdMerge and UILoot use Item.Equals now
      • Reassigned gather & reward items to the existing quests
      • Quest.killName/gatherName replaced with .killTarget / .gatherItem to make more data available when needed
      • Entity.GetSkillIndexByName doesn't check .learned anymore
    • V1.109 [released 2018-03-16]
      • Skill.learned removed, uses .level > 0 checks instead now
      • AreaBuffSkillTemplate, AreaHealSkillTemplate CheckTarget both set temporary target now to fix lookat
      • Player.CmdPartyInvite users 'other' instead of 'player.target' now
      • NetworkManager MaxSentMessageQueueSize set to new default of 512 instead of 128
      • Fixed Vigor Potion reciple template missing items after scriptable items update
      • Player default equipmentInfo strings adjusted to short versions now too
      • Improved tooltips of existing quests
      • NetworkManager doesn't use UILogin/CharacterSelection/Creation anymore. Those UIs work fully on their own now. Also gets rid of several FindObjectOfType calls.
      • UILogin uses public UIPopup component now instead of FindObjectOfType
      • UICharacterSelection uses public UICharacterCreation component now instead of FindObjectOfType
      • UICharacterCreation uses public UICharacterSelection component now instead of FindObjectOfType
      • NetworkManager IsAllowedAccountName/IsAllowedCharacterName checks moved into their own functions. UI uses them too.
    • V1.110 [released 2018-03-20]
      • UICharacterSelection/Creation race condition fixed
    • V1.111 [released 2018-03-23]
      • Upgraded to Unity 2017.4 LTS
      • Item Mall: scrollbar position is reset when switching categories
      • Default ToolTip message cleared so people with low fps don't see 'This is a Tooltip!' message for one frame anymore
    • V1.112 [released 2018-03-27]
      • WASD movement reimplemented via agent.velocity instead of agent.destination to fix a few issues
    • V1.113 [released 2018-03-28]
      • Player.CmdCreateGuild 'guildName' instead of 'newGuildName' for Database exists bug fixed
    • V1.114 [released 2018-04-05]
      • Converted all 'var' type definitions to proper type definitions
      • NetworkManagerMMO.OnServerDisconnected uses Utils.GetGameObjectFromPlayerControllers now
      • UIWindow doesn't set up the close button's callback via GetComponent anymore. All the buttons have their OnClick event's forwarded to UIWindow.OnClose in the Inspector now
      • Removed '#if UNITY_5_5_OR_NEWER' when using 'UnityEngine.AI'
      • DefaultVelocity, TextMeshCopyText, TextMeshFadeAlpha, NavMeshPathGizmo don't use GetComponent anymore, the component is assigned in Inspector instead
      • GUIConsole height is now customizable in the Inspector
      • Chat shows 'use /g for guild chat' message again since it was implemented a while ago
      • Player.EventMoveEnd fixed velocityPending not being reset which caused a bug where players couldn't accept new quests after doing WASD movement
    • V1.115 [released 2018-04-06]
      • BuffSkillTemplate: fixed NullReferenceException on target when caster disappeared
    • V1.116 [released 2018-04-16]
      • Monster.NextReadySkill() renamed to NextSkill()
      • Monster.NextSkill checks mana too
      • Pets can cycle through skills now via Pet.NextSkill()
    • V1.117 [released 2018-04-20]
      • Upgraded to Unity 2017.4.1 LTS for important bug fixes
      • UISkills, UISkillbar check player.CastCheckSelf instead of only skill.IsReady so that mana etc. are checked too. Saves bandwidth for situations where players might hammer the skill keys while they are still out of mana.
      • Chat: player renamed to onlinePlayer in some cases to avoid hiding the 'player' member variable
      • Player FSM: EventNavigateVelocity cancels current skill cast now
    • V1.118 [released 2018-05-19]
      • Documentation updated
    • V1.119 [released 2018-05-21]
      • UIPopup: removed outdated comment
      • UIChat: fixed reselecting after sending message
      • Chat scrollbar is now transparent by default
      • Item/Quest/Skill/Buff comments updated
      • Guild.IsValidGuildName uses <= instead of < for length check to fix a bug where the guild creation window's button wouldn't be interactable on max length
      • NetworkTime.Update [ServerCallback] added
      • Database: removed guild table, added guild and guildRank to character table for faster and easier queries
      • Database: characters.guild index added for performance (don't need to search the whole database to find guild members anymore)
      • Entity.RpcOnDamageReceived + addon hook
      • UsableItemTemplate comments improved
      • Player.CmdUseInventoryItem simplified
      • UsableItemTemplate.OnUsed added for client sided effects like particles when using potions
    • V1.120 [released 2018-05-28]
      • Upgrade Info: this is a Syntax Update. Don't panic, all you have to do is rename Item/Skill/Quest/RecipeTemplate scripts, Unity won't reset your ScriptableObjects. The only thing you need to reassign are monster item drops. Make backups before you update!
      • Renamed Item/Skill/Quest/RecipeTemplates to ScriptableItem/Skill/Quest/Reicipe because that's what they are.
      • { } parentheses update. { always starts in a new line now.
    • V1.121 [released 2018-05-29]
      • UI hooks removed for performance and because no one seemed to be using them anyway
      • Removed UITextCopyName because it wasn't needed anymore
      • Player.CanCompleteQuest syntax improvements
      • Player.CmdCompleteQuests uses CanCompleteQuest to simplify code
      • Player.CanStartQuest renamed to CanAcceptQuest for consistency with CmdAcceptQuest command
      • Player.CanCompleteQuest checks inventory space if there is a reward item. Player.CmdCompleteQuest + UINpcQuests both use CanCompleteQuest now.
      • Player.questLimit renamed to activeQuestLimit; only checks active quests now because there's no point in limiting completed quests
      • UI Quests: replaced old scrollview with new one that also has a viewport so auto hiding the scrollbar works
      • UI Quests window size increased
      • UI Quests: [+] [-] buttons to expand/hide description text. feels a lot better.
      • Documentation updated to latest online version
      • Reverted database guild structure changes because they didn't work (terminate, resave, notices, kicking, etc.); added detailed comment why this is better
      • Database: guild_members renamed to character_guild for consistency; character as primary key now
      • Database: character_guild index on guild added to avoid full scans
      • UINpcGuildManagement: create button not interactable if player already has a guild
      • UINpcGuildManagement: create button clears guild name input
      • UICrafting result slot tooltip fixed (didn't replace {AMOUNT} before)
    • V1.122 [released 2018-06-11]
      • Upgraded to Unity 2017.4.4 LTS for important bug fixes
      • Dark UI
      • LoadSkillbar only adds skills tos killbar if they were learned
      • Equipment Avatar in UI
      • Clickable chat messages (to reply)
      • UIDragAndDropable: OnDragAndClear isn't called anymore if the slot is dropped on itself
      • UIDragAndDroptable: Button interactable set to false while dragging so onClick isn't called anymore if the slot is dropped on itself
    • V1.123 [released 2018-06-27]
      • Warrior equipment icons background transparency
      • UI Respawn Panel: text colors adjusted to new UI style too
      • Entity.CastSkill renamed to FinishCastSkill to make it more obvious
      • Entity.StartCastSkill function that is used by Monster/Pet/Player FSMs now
      • ScriptableSkill.OnCastFinished, OnCastStarted via Entity.StartCastSkill/FinishCastSkill Rpcs
    • V1.124 [released 2018-06-29]
      • Upgraded to Unity 2017.4.6 LTS for important bug fixes
      • Chat default info messages improved
    • V1.125 [released 2018-06-30]
      • Documentation updated
      • Monster, Pet use attackToMoveRangeRatio = 0.8 instead of hard coding the 0.8 when moving into attack range
      • Animator: run transition durations and offsets all set to 0 to avoid sliding when starting to run
      • Entity.InventoryAdd tries to add to ALL existing stacks FIRST and THEN tries the EMPTY stacks instead of only looping once and adding to the first existing OR empty slot. Fixes a bug where an item would be added to slot0 even though slot1 had the same stack, only because slot0 was already empty.
      • Crafting probabilities
      • UI Window icons for all player windows
      • UI background/windows/foreground/login hints added in hierarchy; all invites moved to foreground, all HUD elements moved to background to make sure that invites are always seen, etc.
    • V1.126 [released 2018-07-24]
      • Upgraded to Unity 2017.4.7 LTS
      • UIDragAndDropable: OnDragAndClear is only fired when dropping a slot into nirvana, not when dropping it on a panel. Fixes issues where OnDragAndClear would be called if we'd drop something in the space between two item slots, etc. This just feels a lot more solid.
      • NetworkNavMeshAgent send interval changed from 0 to 100ms so it doesn't ddos the server with the latest HLAPI CE fixes where sendInterval actually works
      • NetworkNavMeshAgent reimplemented: huge bandwidth reduction because click movement only syncs when destination changed now, not while velocity changes (all the time previously). Also fixes several twitches for wasd moving clients. Added perfect warp detection + Rpc now too.
      • Minimap clear flags set to solid color and color set to a dark gray to match the UI panel. Improvements minimap appearance when standing at the edge of the world.
      • Skeleton Giant: added NetworkName component to avoid "(Clone)" suffix on clients
      • UILogin.registerButton not interactable while connecting anymore
      • NetworkManagerMMO.state so that Login/CharacterCreation/CharacterSelection UIs know when to be visible. Fixes a bug where character selection would be shown while server closed and disconnect wasn't detected yet.
      • UILogin status shows 'Handshake' now too
    • V1.127 [released 2018-07-25]
      • Minimap Icons
      • Minimap Texture size increased, Anti Aliasing enabled, Filter mode set to Trilinear
    • V1.128 [released 2018-07-27]
      • Passive Skills
      • UI Skill prefab disabled color changed to white so that unlearned skill icons are shown in the original color
      • Skill.ToolTip now always shows at least level 1 so that unlearned skills don't show level 0 descriptions
      • UI Character Info shows critical and block chances now
    • V1.129 [released 2018-08-24]
      • UIDragAndDropable: added origin.dragable check to fix a bug where passive skills could still be dragged to the Skillbar because Unity called OnDrop even if our object's dragable was set to false
      • Documentation updated (CCU tests)
      • Removed channel tags to prepare for new networking. Removed unreliable channel from NetworkManager so it only uses one ReliableFragmented channel for everything now.
    • V1.130 [released 2018-08-27]
      • Hard Shell passive skill now increase block instead of health, because it's cooler
      • Player.LoadSkillbar: checks if entry is valid item/equipment/learned skill instead of only checking learned skill. Fixes a bug where items/equipment wouldn't be loaded after the previous skillbar change.
      • Documentation Updated
      • Fixed 'ClientScene::AddPlayer: playerControllerId of 0 already in use.' bug when pressing character selection select button too fast while on low fps or high latency. The button is now disabled after pressing select.
      • Hierarchy: Trees moved into Environment/Trees
      • Hierarchy: Temple & Tents moved into Environment/Buildings
    • V1.131 [released 2018-08-29]
      • Moved Networking away from UNET to Mirror + Telepathy
      • => Manual Update Guide:
    • V1.132 [released 2018-08-29]
      • Mirror.Weaver.dll updated to latest version to fix a bug where UnityEngine.UI couldn't be resolved if one of the networking scripts used it
    • V1.133 [released 2018-08-30]
      • Replaced Hierarchy Respawn point NetworkStartPosition component with the one from Mirror too
      • Moved SQLite DLLs into Plugins/SQLite
      • Mirror DLLs moved into Plugins/Mirror
    • V1.134 [released 2018-08-30]
      • Updated Mirror to latest version. Fixes DLL resolved issues once and for all because all loaded DLLs are properly detected now.
    • V1.135 [released 2018-09-02]
      • Assigned missing netIdentity fields in player's chat components (forgot to do that after Mirror update)
    • V1.136 [released 2018-09-06]
      • Mirror updated to latest version (NetworkManager.maxConnections is shown in Inspector again)
      • Documentation updated
    • V1.137 [released 2018-09-16]
      • Mirror updated to latest version
        • WebGL host mode fix
        • OnStartServer NetworkServer.Spawn fix
        • NetworkClient.Update null check
        • pauseQueue improved
    • V1.138 [released 2018-09-28]
      • Database.LoadInventory/LoadEquipment/LoadSkills/LoadQuests: added warnings in case items can't be loaded because they were deleted or aren't in the resources folder
      • NetworkName/NetworkNavMeshAgent/NetworkTime: comments updated
      • Player CASTING EventSkillFinished: simplified code and made it more robust
      • Player CASTING EventSkillFinished: added check to clear currentSkill if skill requires a valid target. fixes a bug where tab targeting didn't work anymore for if the warrior killed a monster
      • Updated Mirror & Telepathy
      • Speed Buffs; added Windwalk skill to Archer
      • Buff/Item/Quest/Skill: .data access now throws a useful error message if the item with that hash was never loaded
    • V1.139 [released 2018-10-04]
      • Rubberband movement via NetworkNavMeshAgentRubberbanding
      • Player.cmdEvents replaced with simple bools
      • Renamed WSADHandling to WASDHandling
      • NavMeshAgent.ResetMovement extension replaces all agent.ResetPath calls
      • Player FSM: movement modifications
    • V1.140 [released 2018-10-09]
      • Update Info: make sure to replace NetworkProximityCheckerCustom components with the new NetworkProximityChecker everywhere.
      • Player.LateUpdate sets animator moving parameter to Entity.IsMoving, so that the rubberband movement's animation isn't delayed and waiting for the server's 'state' variable anymore. This gives perfectly smooth movement. Also removed the Entity.IsMoving server tag now.
      • Player.OnValidate makes sure that NetworkNavMeshAgentRubberbanding component is above Player component to avoid a bug where NetworkNavMeshAgentRubberband would overwrite local player host's WASD movement velocity.
      • Skill predecessor required levels
      • Updated Mirror; replaced NetworkProximityCheckerCustom with NetworkProximityChecker in all Entities and Skill Effects, because it was improved in the latest Mirror version
      • Usable Item cooldown buffs (for potions etc.)
      • Mirror updated to latest version (NetworkTime.time). Changed all endTimes to double and code uses NetworkTime.time instead of Time.time everywhere now.
      • NetworkNavMeshRubberbanding: lastReceivedDestination is now reset after the change was detected. Fixes a bug where the server would constantly detect the destination change.
      • Latency indicator
      • All player movement now happens on the client, the server never moves the player except for agent.Warp. Fixes race conditions and a bug where client couldn't move anywhere else after moving to a monster to attack it. There was no good way to solve the problem. Having all movement on the client gets rid of the magic.
      • Entity.FinishCastSkill now passes the full skill to the Rpc to avoid race conditions with synchronization where 'skillCur' might still be an old or new value and then OnCastFinished wouldn't be called. This way it's 100% fail safe.
      • Entity.OnSkillCastFinished event added
      • Player.OnSkillCastFinished now handles all the after-cast actions like nextSkill, nextDestination etc. and CASTING state force resets any new movement while casting to avoid race conditions and latency issues with rubberband movement
    • V1.141 [released 2018-10-10]
      • Stuns
    • V1.142 [released 2018-10-11]
      • Sound support added (ScriptableSkills)
      • Safe Zones added
      • NetworkNavMeshAgentRubberbanding: added state check to the 'rubber' (validation) part to reject movement during casting/stunned/dead etc. no matter what. The player FSM already resets it, but we would still get twitching and lookAts otherwise.
      • Player FSM: TRADING state rejects movement now, instead of stopping the trade
      • WASD movement while CASTING now sets pendingVelocity and cancels follow up attacks instead of trying to do WASD movement while casting, which would be rejected on the server anyway
      • Player.WASDHandling doesn't do LookAt when trying to do WASD movement while casting
      • Crafting Time (can be set in the recipe)
      • Fixed archer & warrior start positions: forgot to reassign the prefabs in the start positions after the Mirror upgrade
      • Entity.CanAttack made virtual to provide base checks like alive, not self, etc., so Player/Monster/Pet don't have to check that themselves.
      • Entity.OnDeath clears currentSkill so that Monster/Player/Pet don't need to do it manually
    • V1.143 [released 2018-10-12]
      • Upgrade Info: this will break your existing quests, sorry. It will be 100% worth it though.
      • Scriptable Quests: ScriptableQuest is now abstract and can be inherited from for custom quest types, e.g. 'gather item' or 'kill monster' or 'kill player 10 levels higher than you', 'walk to location', etc.
      • Entity.OnTriggerEnter/Exit are now protected so that inheriting classes can use OnTrigger functions too, while still calling base.OnTriggerEnter/Exit
      • Changed AudioSources for all prefabs to 3D from 2D (spatial blend)
    • V1.144 [released 2018-10-15]
      • 3D Character Selection
      • Modified 'Blocked Path' environment area for 3D character selection
      • Entity.UpdateOverlays function for nameoverlay updating etc. Puts that functionality into one simple function that is also inherited by Npc/Player/Pet for their overlays. Makes UpdateClient functions a lot more simple.
      • Mirror updated to latest version (huge(!) SyncList bandwidth improvements)
    • V1.145 [released 2018-10-17]
      • Mirror updated to latest version (NetworkIdentity.observers improvements, AssetId via Guid, etc.)
      • Removed deprecated GUI Layer from Main Camera
      • Fixed first camera mouse rotation jumping to original rotation from Awake, which was different from the real one that we had after character selection (hence a jump)
    • V1.146 [released 2018-11-09]
      • WebGL default quality set to simple
      • UI Latency: fixed okay color (yellow instead of green too)
      • Monster prefab's StunnedOverlay layers set to 'Monster' now (instead of 'Player'). Same for Pet.
      • Added version number (player settings - bundle identifier)
      • Monster prefab's StunnedOverlay layers set to 'Monster' now (instead of 'Player'). Same for Pet.
      • UI Crafting Panel position updated
      • Entity now has a public audioSource field to be assigned in the Inspector. This avoids a ScriptableSkill.OnCastStarted GetComponent call
      • Utils.ClosestDistance uses ClosestPoint and returns 0 for intersections
      • collider.ClosestPointOnBounds replaced with Collider.ClosestPoint everywhere for improved accuracy. Also reduced all normal attack skill ranges a bit to adjust for it.
      • Upgraded to Unity 2017.4.13 LTS
      • Database: Fixed warning message for equipment size
      • UI TextLatency renamed to Latency in Hierarchy
    • V1.147 [released 2018-11-20]
      • Character selection previews are now cleared on client when joining world, not on server
      • UISkills: removed unnecessary skills.FindIndex because we don't have buffs and skills in one list anymore
      • EquipmentSlot: overlays don't block Raycasts anymore. Makes drag and drop easier.
      • UINpcTrading/UINpcDialogue/UILoot/UINpcPetRevive/UIChat singleton added to avoid FindObjectOfType calls in Player.cs
    • V1.148 [released 2018-11-30]
      • Upgrade Info select all weapon items in the resources folder, go to Debug view in the Inspector, then replace their source scripts with WeaponItem instead of EquipmentItem.
      • Ammo equipment slot added to archer
      • Arrow item
      • Bow consumes arrow
      • Alchemist sells arrows
      • Projectile start position fixed in clients
      • Player.localPlayer added to replace Utils.ClientLocalPlayer() function. This is easier to use.
      • Removed a few unused assets in the project folder
      • ProjectileSkillEffect uses speed * fixedDeltaTime because FixedUpdate tick rate may vary and may be set to different rates on headless etc
      • WeaponItem that inherits from EquipmentItem. Replaced all swords/bows' scripts with WeaponItem via Inspector Debug View
      • Skill CheckSelf() moved from Entity to ScriptableSkill so that different skills can have different checks, e.g. check ammo for projectile skills etc.
      • UINpcTrading tooltip uses ItemSlot now so that {AMOUNT} is replaced in tooltip text
      • TrailRenderer added to Arrow prefab
      • Entity.manaRecoverRate fixed: used healthMax percentage before.
      • Equipment slots moved from Player to Entity so that TargetProjectileSkill can check the entity's equipment for ammo
      • Equipment slot amount overlays
      • UI NpcTrading panel: buy and sell input character limit increased from 2 to 4 for items with a huge maxstack like arrows
      • UI NpcTrading panel: input widths increased to fit 4 digits
      • UI Inventory gold text now supports 12 instead of 5 digit gold amounts
      • EquipmentInfo defaultItemAmount added; Warrior and Archer prefab default amounts set to 1 where necessary; Archer default 500 arrows added
    • V1.149 [released 2018-12-10]
      • UISkillbar caches CastCheckSelf
      • UITarget shows target's buffs now too
      • Mirror updated to latest version
      • Entity, Chat .netIdentity fields removed because they are in Mirror now
      • NetworkNavMeshAgentRubberbanding: use cached hasPath variable
      • Fixed host WASD movement not syncing to other clients
      • Pet return distance increased to match archer's range
    • V1.150 [released 2018-12-14]
      • NpcTrading buy slot tooltip amount fixed too
      • Mounts
      • Npc Revive works with all summonables now, not just pet
    • V1.151 [released 2018-12-16]
      • Upgraded to Unity 2017.4.17 LTS
      • SummonableItem.CanUse: make sure that player state is IDLE or MOVING so pets/mounts can't be summoned while casting, stunned, etc. anymore
      • UINpcTrading assigns dragable so empty slots can't be dragged
      • UINpcRevive assigns dragable so empty slots can't be dragged
      • Pet uses owner's speed so that it can follow fast and mounted owners without teleporting
      • Summonable.owner caches result now so it also works before Spawn was called. Fixes a NullReferenceException if a pet with max level and max exp was summoned, in which case Pet.experience would access Pet.owner, which was still null because NetworkServer.Spawn wasn't called in PetItem yet when assigning experience.
    • V1.152 [released 2018-12-19]
      • Mirror updated to latest version (performance improvements)
      • Player.UpdateClient skill usage: range is not multiplied with attackToMoveRangeRatio again anymore, because it already is before
      • Bandit follow distance increased to 20 so the archer can't kill it without pulling aggro anymore
      • ProjectileSkillEffect onSetInitialPosition event added and hooked up to Arrow prefab's TrailRenderer.Clear function to fix the trail's initial position on clients.
      • Player UI windows all close after disconnect now.
    • V1.153 [released 2018-12-31]
      • Mirror updated to latest version (OnStartClient not called in scene objects fix)
      • NetworkNavMeshAgentRubberbanding simplified. Sends position every 100ms instead of path & velocity magic
      • NetworkNavMeshAgent: reuse HasPath detection
      • NetworkNavMeshAgent OnDeserialize now resets path when reading velocity to properly handle ResetPaths. Fixes a bug where monsters would slide on the client if they were killed while moving
      • Mount.OnStartServer doesn't load skill templates anymore. Mounts don't use skills.
      • Mount: removed unnecessary MOVING state and EventMoveEnd event. Mount only cares about alive or dead.
    • V1.154 [released 2019-01-04]
      • Mirror updated to latest version (rpc hashing, syncinterval, fixes)
      • NetworkNavMeshAgentRubberbanding: TargetResetMovement includes the reset position so that client keeps in sync with whatever player position was on the server
      • Fix warrior not attacking monster when double clicking after reaching target
      • Fix client not being able to target other monsters after killing one
      • Player.cancelActionKey instead of checking for KeyCode.Escape everywhere
      • NetworkNavMeshAgentRubberbanding: simplified local player movement change detection. Fixes a bug where server would constantly detect client moves
    • V1.155 [released 2019-01-29]
      • Manual Upgrade:
        • Open uMMORPG with Unity 2018.2.2f20
        • Delete old Mirror folder, use the new one
        • Drag all networked prefabs (monsters, players, skill effects, etc.) into the scene. Select them all. Go to debug view in the Inspector (top right icon), reassign missing NetworkIdentity components.
        • Reassign missing NetworkProximityChecker components with new NetworkProximityGridChecker and reassign proximity checker fields in Entity components.
        • Save each prefab, remove them all from the scene again.
        • Don't panic. If you have trouble upgrading then please let me know and I'll help. This is the last time we have to replace script components with Mirror.
        • Switch Scripting Runtime version in Edit->Player Setttings to .NET 4.x, restart Unity, delete System.Data.dll from sqlite folder.
      • Upgraded to Unity 2018.2.20f1 + .Net 4.x to fix a bug where a client build would freeze after 3-15 minutes on OSX when the client sends data over the network. Originally we wanted to wait for Unity 2018.4 LTS to upgrade, but this fix is too important to wait.
      • Mirror updated to latest version: source drop-in instead of DLLs and a lot of bug fixes and improvements.
      • Escape key now cancels movement locally instead of on the server. Avoids a forced reset to the server's slightly behind position on local player.
      • Fixed chmod for files from 755 to 644 (default)
      • Remove [SyncVar] GameObject workarounds because Mirror handles it now
      • NetworkManagerMMO headless detection removed and feature enabled in Mirror's new NetworkManager instead
      • Adjusted spawn points so people don't spawn floating in the air for one frame
      • Cleared all name/guild/stun/quest overlays by default, so that they aren't shown for one frame when spawning and when moving into proximity
      • Skeleton giant scale reset to 1, increased 3D model scale instead. Fixes issues with too big and too blurry name overlays.
      • Mount: MOVING animation checks owner.IsMoving instead of owner.state==MOVING so that the animation isn't delayed in high latency situations
      • NetworkProximityGridChecker: 30x performance increase when checking 1000 monsters and almost half GC
      • Less logging on server, to focus on the important messages instead
      • Entity.OnTriggerEnter/Exit made virtual so it can be overwritten by Player without 'new' keyword
      • Player.OnTriggerEnter checks if server before calling QuestsOnLocation to fix the warning messages that QuestsOnLocation was called on client
      • Dont' show rubberbanding message each time. This might happen a lot under heavy load when resetting other player's positions on the client
      • Added BuffsPanel under Buffs to properly hide them after disconnecting
    • V1.156 [released 2019-02-05]
      • Enable nagle algorithm by default. Scales better with CCU.
      • Mirror updated to latest version (headless tickrate, lateupdate race condition fix, telepathy ever increasing threadcount fix)
      • SkillEffect RequireComponent changed to NetworkProximityGridChecker too
      • Fix guild members not seeing their guild info after logging in again
      • Renamed HealSkillTemplate to HealSkill for consistency
      • Fix AreaBuffSkill / AreaHealSkill being applied multiple times if the candidate had multiple colliders
      • Remove unused Extensions.FindRecursively
      • GetNearestStartPosition moved from Extensions to NetworkManager
      • NetworkNavMeshAgentRubberbanding: TargetResetMovement not public anymore because it shouldn't be used from the outside
      • Player.networkNavMeshAgent field renamed to .rubberbanding
      • Rubberbanding: agent.ResetMovement replaced with rubberbanding.ResetMovement for 100% accurate detection. Removed .Reset detection from NetworkNavMeshAgentRubberbanding.Update to fix false positive detection.
    • V1.157 [released 2019-02-09]
      • Chat renamed to PlayerChat because it's a player component
      • Instanced dungeons & portals
      • NavMeshComponents are now used for dungeon and environment
      • Removed unused fields from Party.cs
      • Chat.CmdMsgGuild: use TryGetValue to avoid looking member up twice
      • Chat.CmdMsgParty: use TryGetValue to avoid looking member up twice
      • Sync party via SyncVar for failsafe synchronization
      • New party system: PartySystem.cs manages all the parties. No more manual broadcasting; prepares for dungeon party instances
      • NetworkNavMeshAgent.OnDeserialize warning message fixed
      • NetworkNavMeshRubberbanding: sample position in OnDeserialize to avoid error message if another player runs into an instance that we don't see, but server hasn't yet destroyed it because proxchecker hasn't yet realized that the player is out of range now.
      • Database.CharacterLoad samples navmesh position before warping. this way we can avoid the Debug.LogError from inside NavMeshAgent and show our own log message with the proper reason instead.
      • Added NetowrkName to bandit and skeleton so they spawn with the correct name
      • set WebGL default quality to beautiful to avoid grass flickering
      • SkillbarEntry, EquipmentInfo, ItemMallCategory structs made partial in case someone needs to extend them
      • Documentation updated (Instanced Dungeons)
    • V1.158 [released 2019-02-13]
      • Grid: remove HashSet at position if empty so we don't keep them in memory forever.
      • NetworkProximityGridChecker.OnDestroy: remove no matter what
      • Mirror updated (server tickrate)
      • Set server tick rate to 20
      • Database.CharacterLoad: don't show agent reset message all the time
      • Set each entity prefab's stunned overlay default text to 'Stunned!' again so that stunned text is shown again.
    • V1.159 [released 2019-03-05]
      • Update Mirror to latest version (lots of fixes and improvements)
      • PlayerChat.CmdMsgWhisper: use TryGetValue for maximum performance
      • Utils: remove unused functions, improve syntax
      • NetworkManagerMMO: forgot to remove tick rate setting. Mirror handles that now.
      • Utils.IsNullOrWhiteSpace removed, NET 4.5 has string.IsNullOrWhiteSpace now.
      • Net 4.X syntax for getters
      • Upgraded to Unity 2018.3.6 to prepare for LTS, and to avoid 2018.2 memory leak bug (https://github.com/vis2k/Mirror/issues/427)
      • Deleted old terrain_trees file
      • NetworkManager.OnClientReceivePopup renamed to OnClientError
      • NetworkManager.ClientSendPopup renamed to ServerSendError
      • Remove MessageIds everywhere (latest Mirror version assigns them automatically)
      • CharacterSelect/Delete messages inherit from IntegerMessage to simplify code
    • V1.160 [released 2019-03-09]
      • Mirror updated to latest version (sceneID fix). Please open and resave each of scene once.
      • Use nameof(function) for Invoke/InvokeRepeating
      • NetworkManagerMMO.Start calls base.Start
      • NavMeshComponents updated to 2018.3 to fix warnings
    • V1.161 [released 2019-03-10]
      • UI singletons: only assign once to fix Network Zone errors where UI elements would refer the destroyed panels instead of the ones in DontDestroyOnLoad
    • V1.162 [released 2019-03-15]
      • Monster.UpdateCASTING EventSkillFinished: fix NullReferenceException if target disappeared before checking target.health
      • NetworkNavMeshAgent: add agent.ResetPath detection. it only worked before because agent.velocity is != 0 after resetting the path for some reason
      • Mirror updated to latest version
        • fixed sceneID mismatch if disabled scenes are in build settings
        • fixed sceneID mismatch if no scene is in build settings
        • source based weaver
    • V1.163 [released 2019-03-26]
      • Mirror updated to latest version
        • SyncList<struct> instead of SyncListSTRUCT
        • First login spawns observers immediately now
        • Protect against allocation attacks
        • NetworkClient static
      • NetworkProximityGridChecker: playerController != null check not needed anymore
      • NetworkManagerMMO.OnServerAddPlayer: null check message.value bytes
      • UILogin: disabled host, dedicated buttons if webgl because webgl can't start a server
      • PlayerChat: local chat uses [ClientRpc] instead of sending a [TargetRpc] to each observer manually
      • [TargetRPC] NetworkConnection parameter removed everywhere because it's optional now
      • Grid renamed to Grid2D to avoid Unity 'Grid class already exists' warning
      • NavmeshPathGizmo renamed to NavMeshPathGizmo
      • Fixed NavMeshPathGizmo NullReferenceExeption after rebuilding scripts sometimes
      • Find the cleaver quest tooltip fixed
      • Change enum types to byte to minimize bandwidth
      • Fix MissingReferenceException when clicking PartyHUD icon of a member that moved out of proximity range
      • Entity.DealDamageAt: don't allow a short stun to overwrite a long stun
    • V1.164 [released 2019-03-28]
      • Player.BalanceExpReward: balance for 20 levels up/down, instead of 10. this way a level 11 player gets a small amount of exp from a level 1 monster. less confusing this way.
      • Monster IDLE: EventSkillRequest doesn't clear target if skill is on cooldown/if monster is on low mana. this way the monster waits until it can cast. Fixes a bug where a monster would go back to random movement if the skill was on cooldown while trying to fight.
      • Skill.IsOnCooldown() added
      • Skill.IsReady checks cooldown AND casttime. this way skillbar skills are disabled while casting, avoids button smashing sending lots of packets to the server too.
      • Monster.startPosition is now set in Start instead of Awake, because that's what Start is for. Fixes a bug where runtime spawned monsters weren't respawning properly.
      • UI: scroll view sensitivity increased from 1 to 10 everywhere for a better scrolling speed
      • Player.SelectionHandling: if double clicked an entity that we can't attack/loot/talk, then just move there. Fixes a strange user experience where if the user stands in a safe zone and double clicks a monster, nothing would happen. Instead it will move there now.)
      • Player.SelectionHandling simplified 'else walk' cases
      • UICrafting WindowAddon panel: removed redundant icon
      • UI Player Trading: reduced TextTitle font size from 13 to 12 so it's visible again
      • Fixed UI Chat activating during WASD movement because the scrollbar Navigation setting was set to Automatic, also enabling keyboard navigation. Setting it to None disables it and fixes the bug.
      • Player default inventory items are now configurable with amount by using ScriptableItemAndAmount type
    • V1.165 [released 2019-03-29]
      • Entity.CanAttack raycasts the NavMesh to not allow attacks through walls anymore. Very important to prevent exploits where someone might try to attack a boss monster from another room, etc.
      • Player.CmdNpcTeleport: clear target after teleport
      • MinimapMarkers are now SpriteRenderers instead of Cylinders + Mesh Renderers. Less triangles to draw, easier to use, sharper on the minimap
      • Player.AttributesSpendablePerLevel static variable added. Can be used to allow more than 1 attribute point per level. Allows 2 per level now.
      • UI Confirmation window, used in UICharacterSelection to delete characters with less risk for accidental clicks.
      • Database: characters.name field is created with COLLATE NOCASE so that CharacterExists is case insensitive and we can't create both 'Archer' and 'archer' characters.
      • NetworkManagerMMO: password salt is now configurable in the Inspector
      • Only players copy their name to the NameOverlay. Monsters/Npcs/Pets NameOverlay.text fields are set manually. Saves computations.
      • Quest.field0 renamed to progress. It's more obvious this way.
      • Chat: use different text prefabs for different channels. This way the color, font type, background, etc. can be different for different channels.
      • PlayerChat: ChatMessage class converted to struct to avoid GC
      • Database converted to MonoBehaviour component that is added to the NetworkManager. This allows for future abstract Database type with different implementations like MYSQL. It also allows us to customize properties in the Inspector (like Database file name) and to make use of MonoBehaviour functions like Update. MAKE SURE TO MODIFY DATABASE ADDON HOOK FUNCTIONS TO NOT BE STATIC ANYMORE WHEN UPGRADING.
      • Database: add index on 'account' for 'characters.account' to avoid full scans when loading characters in CharactersForAccount function
      • Database: character.online field is set immediately after joining the world already. Otherwise it would only be set after the next CharacterSave call, which could easily take another 5-10 minutes.
      • Database: accounts.created DATETIME added for statistics
      • Database.IsValidAccount: simplified account, password, banned check by letting SQLite handle it
      • Database.IsValidAccount renamed to TryLogin, which also sets a new accounts.lastlogin field
      • Database: characters.online is now an INTEGER (0 or 1), and characters.lastsaved DATETIME added. This is more cleaner than writing the datetime as string only while online, and allows for lastsaved time checks even while offline.
    • V1.166 [released 2019-04-03]
      • Replace all TextMeshes with TextMeshPro
      • LevelBasedInt/Long/Float renamed to LinearInt/Long/Float
      • LevelBasedValues: ExponentialInt/Long/Float added
      • Player/Pet: max experience grows exponentially now
      • UI Chat: forgot to remove example message prefab from scroll view
      • Player guild functions: use TryGetValue for performance
      • Player.guildName moved into Guild.name for more simple code
      • Database.SaveGuild uses guild struct directly to simplify code and avoid one members.ToList() call
      • Documentation updated
      • UpdateOverlays uses proper IsGuild check with null check
      • Guild.Empty to work around Mirror bug https://github.com/vis2k/Mirror/issues/696
      • GuildSystem.cs similar to PartySystem.cs. Less magic, and guilds aren't resaved after every single broadcast anymore.
      • Updated Mirror to latest version to fix various bugs
      • NetworkProximityGridChecker: force hidden doesn't need to add own connection anymore after latest Mirror change
      • PartySystem.CopyTo renamed to BroadcastTo for consistency with guild system
      • PartySystem.CopyToMembers renamed to BroadcastChanges for consistency with guild system
      • PartySystem.LeaveParty: shorter code
      • GuildSystem.BroadcastTo for consistency with PartySystem. Makes LeaveGuild and TerminateGuild shorter too
      • PartySystem.BroadcastChanges saves in dict too for consistency with GuildSystem
      • Party.Empty to work around Mirror bug https://github.com/vis2k/Mirror/issues/696
      • Use out variable inline declarations
      • Fix guild promote/demote not syncing to clients because dirty wasn't set, because .Equals was true, because oldGuild and newGuild share same .members memory location, hence modifying it in newGuild already modified it in oldGuild, so the .Equals call later on ended up returning true.
      • TargetProjectileSkill.GetEquipmentWeaponIndex moved to Entity and renamed to GetEquippedWeaponIndex
      • ScriptableSkill.requiredWeaponCategory replaces .requiresWeapon. Allows for weapon type specific skills, and skills that work with all weapon types. Make sure to change all archer skills requiredWeaponCategory to "WeaponBow" and all warrior skills requiredWeaponCategory to "WeaponSword" when upgrading.
      • ScriptableItem/Skill/Quest/Recipe: check for duplicates when loading from resources. This allows us to use subfolders safely.
      • Moved ScriptableItems/Skills into subfolders
      • UIConfirmation, UIPopup singleton added
      • Player.InventoryOperationsAllowed() function added to keep all inventory swap/merge/split/use state checks in one place
      • Allow inventory operations while trading as long as not locked yet
      • Player.Craft: added [Server] tag
      • UI Crafting: show amount overlays in slots
      • Crafting with ingredient amounts. Make sure to reassign all recipe ingredients with their amount.
      • Entity.lastCombatTime added
      • Combat Disconnect delay prevents players from fleeing combat by disconnecting immediately. Player.allowedLogoutTime + remainingLogoutTime based on lastCombatTime added. NetworkManager only logs out the player after that time. UIShortcuts shows tooltip on clients too.
      • Npc.quests changed to ScriptableQuestOffer with acceptHere and completeHere flags to make 'talk to npc' quests possible. Make sure to reassign all npcs quests with both accept&complete set to true when upgrading.
      • Guardian Npc added, and Blocked Path quest has to be finished at the guardian now.
      • Loot indicator particle
    • V1.167 [released 2019-04-08]
      • Mirror updated to latest version (breakpoint fix etc.)
      • updated Guild.Empty/Party.Empty comments
      • LevelBasedValues: sort linear int/long/float base/bonus for easier use in Inspector
    • V1.168 [released 2019-04-10]
      • Grid2D: use out variable inline declaration
      • Mirror reverted to the version before the Asset Store import bug
    • V1.169 [released 2019-04-22]
      • fix casting skill while running causing animation to switch between CASTING and MOVING while still sliding to the final position
      • Mirror updated to latest version (Weaver Unity.Cecil replaced with Cecil, Stack Overflow fix, 2019 support, GC reductions)
      • Database.CharactersForAccount simplified
      • NetworkManagerMMO.IsConnecting syntax improved
      • Extensions.FindIndex isn't needed anymore, it's in Mirror now
      • NetworkManagerMMO.SavePlayer: avoid expensive .ToList call by passing the IEnumerable to Database
    • V1.170 [released 2019-04-24]
      • Mirror updated (server-only movement fix)
    • V1.171 [released 2019-05-11]
      • Mirror updated to latest version
      • Database.Connect function called from NetworkManagerMMO.OnStartServer to only connect on server, not on clients. Fixes the WebGL error.
      • NetworkManagerMMO: disabled some log messages to not spam the server logs
      • Removed empty terrain object
    • V1.172 [released 2019-06-12]
      • Database.OnApplicationQuit closes the connection to prevent locking.
      • Mirror updated to latest version (forceHidden fix etc.)
      • Replace Skinned Mesh Equipment bones if possible in order to follow IK if needed
    • V1.173 [released 2019-06-16]
      • Mirror updated to latest version ("localhost" ip parse fix)
     
    Last edited: Jun 16, 2019 at 10:29 AM
  2. tequyla

    tequyla

    Joined:
    Jul 22, 2012
    Posts:
    322
    Hello,

    Assets is Mecanim compliant ?

    Special price for launch ?

    ++
     
  3. vis2k

    vis2k

    Joined:
    Sep 4, 2015
    Posts:
    3,141
    Hey,
    yes I used Mecanim for the Animations. I really can't say if I change the price in the future, it depends on too many things.
     
    Last edited: Dec 29, 2015
  4. TonyLi

    TonyLi

    Joined:
    Apr 10, 2012
    Posts:
    9,326
    Hi @vis2k - Congratulations on the release!

    Are you planning to make a demo available, maybe hosted on noobtuts.com?

    Are there any issues with loading additional scenes additively into the main uMMORPG scene, for example to stream pieces of the game world in and out?
     
  5. vis2k

    vis2k

    Joined:
    Sep 4, 2015
    Posts:
    3,141
    Hey, thanks!

    The Linux binaries are almost 100 MB, that's a lot. I have a few more hours today, I will see how big WebGL / WebPlayer builds are and upload them if possible.
    EDIT: either the Linux Unity Editor or my Browser don't seem to like WebGL, will have to find a Windows PC first.

    About the scenes (quoting from the new documentation):
    How to use another Scene
    First of all, we have to understand that the game server can only handle one Scene right now, so our whole game world should be in that Scene. If you want to replace the current Scene, you can either just build on top of it or duplicate it and then modify what you want to modify. Unity doesn't have a Duplicate option for Scenes, but we can open the project folder with a file manager, duplicate the scene file and then rename it.

    Note: having multiple Scenes at the same time and allowing players to teleport to them makes sense too. It's very likely that UNET will get a feature like that sooner or later, which would be the best solution. Right now we can't use UNET to connect from one UNET server to another UNET server, which makes transferring players impossible without some really weird workarounds, hence why we don't want to implement that feature just yet.

    Greetings
     
    Last edited: Dec 29, 2015
  6. mmarsyada

    mmarsyada

    Joined:
    Dec 18, 2012
    Posts:
    6

    I'm no expert but I wanted to confirm that I have already added mechanim animations to the controller on the character included in the project and it works fine. I have not tried to use my own model yet but thats next on the list!

    ~mmarsyada
     
  7. TonyLi

    TonyLi

    Joined:
    Apr 10, 2012
    Posts:
    9,326
    I'm sure a webplayer build would be fine for most people, and it's less frustrating to build.

    Okay, I was just curious. Thanks.
     
  8. nixter

    nixter

    Joined:
    Mar 17, 2012
    Posts:
    319
    Hi Vis2K!

    When I first saw uMMORPG posted, I did a quick search to find any discussion online regarding your other three products:
    noobchat - The ultimate Chat Solution
    Navigation2D (Pathfinding for 2D Games)
    ustats - Project Statistics
    And there was nothing I could find about any of them. I understand that they are probably the files to accompany your tutorials and perhaps you didn't feel it necessary to promote them here but it was a bit of a red flag. Regardless, you're here now and communication about your product and many of your implementation decisions.

    Some feedback from where I'm sitting.

    * Demo - Looking forward to this. Purchase isn't even a consideration until this is available.

    * onGUI vs. uGUI - I'm agnostic. While I lean towards staying up-to-date with the latest Unity features, I'm willing to accept your argument for using a simpler and easier to maintain GUI system.

    * ScriptableObject vs. MYSQL - Having to maintain a MySQL server is a pain. I have done it multiple times in the past, but it always comes as an annoyance. You are right to believe that it will cause confusion and disillusionment with more casual developers (casual MMO developers--what an oxymoron!). But serious developers will need a more robust solution, be it MySQL, a hosted service (like Playfab or Parse) or a cloud database like Amazon DynamoDB. From what I read in the docs, it is possible to change all this by modifying DatabaseCharacters.cs so this should not be a problem.

    * Firewall issues - I'm a little confused. Your system uses the Unity client as the "ultimate admin panel". I get that and I can see how that would be very empowering to have a live game where the admin can edit values on the fly and drop new entities into the world at runtime (that is possible, right?). But that means that the game must be hosted either on my home computer or a Virtual Machine running Unity in cloud instance, correct? Does uNET handle firewall issues or would I have to open my home firewall during the game? From the docs, it sounds like the latter unless I get Unity running on a cloud instance, which is also painful like setting up MySQL.

    * Scene size / CCU - Is uNET just for handshaking? It is not like Photon Realtime or PUN where the game is running on remote servers, so uNET is more like the old Raknet-based Unity Networking, correct? The number of players being hosted will be limited by the bandwidth of the server. If I am using my home connection, then that means I could probably host 10-20 players. That is not an MMO. That is a modest multiplayer game and that is OK if that is the intention but that is not what you are advertising this as. And this cannot be marketed as player-hosted multiplayer game because it requires Unity to run correctly with full code access. So please help me understand what the ideal use case for this kit is. How do you see people using this as a commercial product? This is a major concern of mine.

    I'm very thankful that you are working on this. These types of products are what we, the developer community, need. It looks like you have put a ton of work into it and I hope you have the disciple and dedication to see this through. Please don't mistake my tough questions as attacks on your skill or your honesty as a developer. I am sure you are more skilled than I as a programmer and when it comes to honesty, I think most asset kit developers are honest. They just get frustrated and discouraged with the difficult task of supporting customers while simultaneously developing the code and working a paying job and dealing with family and dealing with money issues and etc. It can be overwhelming and I am sympathetic to that.
     
  9. vis2k

    vis2k

    Joined:
    Sep 4, 2015
    Posts:
    3,141
    [Note: Roadmap in the first post now shows features of future versions.]

    About the Demo: I got my hands on a Windows Laptop, might happen today already.

    About MYSQL: I totally agree with you here, I want to avoid it where possible, too. I am aware that people would like to see another database system, and I will do some research to find the easiest solution here.

    About the host: you'd need any kind of virtual(if not too slow) or dedicated server that runs Linux Mint or Ubuntu and then install the Editor. That is only because of the current database solution though, in the future we might be able to just create a headless build and then start it on a server.

    About the amount of people: again, I think the optimal solution would be a headless build (means without any graphics) that runs on a really fast dedicated Linux Server. Unity is also somewhat concurrent, so a decent CPU should get you quite a few players. UNET doesn't have any feature to send around players between different server instances yet, so the whole world would have to run on one server. If you take a look at the private server scene from many MMORPGs, you will see that most of them also run their game on just one (fast) server - I think that's good enough for a Indie MMORPG anyway.

    Don't worry, I am open to any feedback. I want to make a real MMO from this as much as you guys do.

    Cheers
     
    Last edited: Dec 31, 2015
  10. daeuk

    daeuk

    Joined:
    Mar 3, 2013
    Posts:
    67
    I have some questions:
    Does it have UMA support for character creation?
    Does it support area of interest?
    How about lag compensation? What does it use?
    Any chance it will use uGUI instead?
     
  11. tequyla

    tequyla

    Joined:
    Jul 22, 2012
    Posts:
    322
    Hello,

    I follow your project.

    I think, you need to read these rules for beginning:

    https://mmotidbits.files.wordpress.com/2011/03/3_full_view.jpg

    For benchmarking, minimum servers requirement should be : http://www.dell.com/us/business/p/poweredge-r730xd/pd

    Don't forget network and data size over network, be careful with B (bytes) and b(bits).
    1 Byte = 1 octet = 8 bits

    +++
     
    Last edited: Dec 31, 2015
  12. vis2k

    vis2k

    Joined:
    Sep 4, 2015
    Posts:
    3,141
    That's one powerful server!

    I just created a WebGL and a WebPlayer build, sadly both of them are crashing as soon as any UNET Operation happens. So I'll have to track it down, report it and wait for a fix before a web demo, sorry guys.
     
  13. tequyla

    tequyla

    Joined:
    Jul 22, 2012
    Posts:
    322

    Hello,

    ouch :(

    don't really understand: uNET not working or asset using uNET not working ?

    ++
     
  14. vis2k

    vis2k

    Joined:
    Sep 4, 2015
    Posts:
    3,141
    Last edited: Jan 1, 2016
  15. vis2k

    vis2k

    Joined:
    Sep 4, 2015
    Posts:
    3,141
    Small post to keep everyone up to date:
    V1.2 is pretty much finished, so it will be submitted to the store after V1.1 was accepted. The changes for V1.2 can be seen in the first post!

    Thanks to everyone who found and reported a bug either on the forum or via email.

    Next: publish the WebGL build and then start with V1.3 development afterwards...

    EDIT: A WebGL Demo can now be found in the first post!
     
    Last edited: Jan 3, 2016
  16. tequyla

    tequyla

    Joined:
    Jul 22, 2012
    Posts:
    322
    Hello,

    nice update.

    i suggest an option to snapshot the map for minimap and preserve CPU :)

    What is add another monster feature ?Currently, only one monster can be added in the scene ?

    ++
     
    Last edited: Jan 4, 2016
  17. vis2k

    vis2k

    Joined:
    Sep 4, 2015
    Posts:
    3,141
    Hey,
    the plan is to add another monster model to the game, so that there are two different types of monsters.

    About the Minimap: I am actually not too concerned about the performance yet, it's client sided anyway.

    Greetings
     
  18. tequyla

    tequyla

    Joined:
    Jul 22, 2012
    Posts:
    322
    hello,

    I read from your website for Npc.cs The Npc class is rather simple. It contains state Update functions that do nothing at the moment, because Npcs are supposed to stand around all day.

    Is in your plan to add wander function ?

    ++
     
    zedsmith52 likes this.
  19. vis2k

    vis2k

    Joined:
    Sep 4, 2015
    Posts:
    3,141
    I can do that if a few more people request it. This is easy though, you can open the Monster.cs class and see how they wander around and then perhaps let the NPC run around between two Transforms.

    Status Update: I just finished the Headless Mode Detection, so V1.2 will automatically start a dedicated server if in headless mode. This saves lots of computations and memory. All the Unity bugs that affect the Project are now also listed in the first post.
     
    Last edited: Jan 4, 2016
  20. nixter

    nixter

    Joined:
    Mar 17, 2012
    Posts:
    319
    Thanks for answering my questions. So you see this as indie MMO running on virtual / dedicated servers. I agree that with a headless mode, you could squeeze much more performance out of it by giving up the Unity admin panel. But to get more than a couple of dozen CCU, you're going to need an area of interest system as daeuk suggested above. Otherwise the combined traffic of other players and AI monsters will overwhelm the bandwidth. Thankfully, that should be fairly easy to design.

    If you do decided to take the data persistence route, I would suggest taking a look at Playfab. They have announced free service with unlimited user accounts and have an integrated trading system.

    I just got a chance to try the demo. Presently there is no way to test multiple accounts because there is no way to create an account. Are you planning to offer that feature in the demo? There also didn't seem to be anyway to drop things into the world. That is an important feature for basic in-world trading. Will that be possible?

    Overall, looks like a good start. I'm definitely keeping an eye on this.
     
  21. vis2k

    vis2k

    Joined:
    Sep 4, 2015
    Posts:
    3,141
    Hey,
    can you go more into detail about the area of interest part, or do you have any links on that?

    PlayFab looks interesting, I will take a closer look at that.

    Headless mode support was finished today, it has far less CPU and RAM requirements.

    You can easily test it with multiple accounts by just logging in with any account name - they are all valid as long as they aren't logged in yet.

    Not being able to drag something into the world is a design choice. There are generally two options: either have monsters / players drop items into the 3D world (which requires 3D models, Raycasting and Instantiation) or show things in a GUI, like WoW does it for monster looting. I personally prefer the latter option, because it's faster (the less stuff in the Hierarchy, the better) and easier (no need to design more 3D models) for indie games.
     
  22. tequyla

    tequyla

    Joined:
    Jul 22, 2012
    Posts:
    322
    Hi,

    Thanks you.

    With my question, I wanted to evaluate the work needed to improve the gaming experience. And it will be open.

    I maintain that offers a special price for the launch before adding too many updates is a good idea.

    I'm keeping an eye on this, me too.

    ++
     
  23. vis2k

    vis2k

    Joined:
    Sep 4, 2015
    Posts:
    3,141
    Update: V1.1 is now in the Asset Store!
    Edit: V1.2 was also submitted for review. List of changes can be seen in the first post!
    (Note: price will increase to 80$)

    Ok.
     
    Last edited: Jan 5, 2016
  24. takapi

    takapi

    Joined:
    Jun 8, 2013
    Posts:
    79
    Hi, vis2k. :)
    I have the warning of yellow.
    What is this warning ?

    ClientScene::InternalAddPlayer: playerControllerId higher than expected: 0
    UnityEngine.Networking.NetworkServer:AddPlayerForConnection(NetworkConnection, GameObject, Int16)
    NetworkManagerCustom:OnServerCharacterSelect(NetworkMessage) (at Assets/uMMORPG/Scripts/NetworkManagerCustom.cs:163)
    UnityEngine.Networking.NetworkClient:Send(Int16, MessageBase)
    CharacterSelection:OnGUI() (at Assets/uMMORPG/Scripts/CharacterSelection.cs:50)


    and I have another question.
    I want to sell two swords at once.
    However, I can not sell those.
    What should I do ?
     
    Last edited: Jan 5, 2016
  25. vis2k

    vis2k

    Joined:
    Sep 4, 2015
    Posts:
    3,141
    Hey,
    that warning is shown because I have overwritten some functions in the NetworkManager so that the player is added manually after a successful login. The warning has no impact on the game at all and I don't know about any way to avoid it or why the playerControllerId is higher than expected, so we will have to live with it until I know more about it.

    To sell an item, you can talk to the NPC and then drag the item into the sell slot and press the Sell! button. The sell amount is limit to the stack size of the item. So if you have 50 potions all in one inventory slot, then you can sell between 1 and 50 potions at once. But since swords don't stack, the maximum sell amount is always 1.

    Hope that helps, Cheers

    Update: Str/Int character Attributes preview for V1.3 can be seen in the attachment.
     

    Attached Files:

    Last edited: Jan 5, 2016
  26. takapi

    takapi

    Joined:
    Jun 8, 2013
    Posts:
    79
    Thanks for your reply. :)
    By the way, sometimes I have the lootwindow like this screenshot.
    Is this the bug ?
     

    Attached Files:

  27. vis2k

    vis2k

    Joined:
    Sep 4, 2015
    Posts:
    3,141
    Hey,
    it happens when the monster doesn't drop any items. Looks kinda weird, I'll hide it completely in the next version if the monster didn't drop anything.

    Thanks for the feedback!
     
  28. davbar9

    davbar9

    Joined:
    May 19, 2014
    Posts:
    62
    Hi! I have idea for your asset. Can you add first person camera mode. This will help people to can create VRUMMORPG.
     
  29. Tristanl0gd

    Tristanl0gd

    Joined:
    Nov 11, 2013
    Posts:
    3
    Been looking through the docs on your site, pretty awesome stuff. One question for you..
    If the server is being run headless, will it save as it should?
     
  30. vis2k

    vis2k

    Joined:
    Sep 4, 2015
    Posts:
    3,141
    It's not planned right now, but it shouldn't be very hard because you can just use any of the first person camera Scripts on the internet.

    Not yet, but in Version 1.3 it will because I changed the database system to XML yesterday. I will submit V1.3 to the asset store as soon as V1.2 was accepted.

    Greetings
     
  31. Litwin

    Litwin

    Joined:
    Aug 15, 2013
    Posts:
    57
    @vis2k
    Why you don't use MySQL to database?
     
  32. tequyla

    tequyla

    Joined:
    Jul 22, 2012
    Posts:
    322
    hello,

    When monster has been focused, player follow it without animation ie Player slides on the floor.

    After looting all objects, the loot panel don't close automatically.

    ++
     
  33. vis2k

    vis2k

    Joined:
    Sep 4, 2015
    Posts:
    3,141
    Hey,
    here is what I just added to the first post, I hope it answers your question:
    • Why XML for the Player Database? Because it's the simplest solution right now and people shouldn't have to setup a MYSQL database in order to use uMMORPG. C#'s XML support also allows us to write just about any class to disk without modifying it or manually serializing it, which saves us lots of code (having less code is important for a MMO). XML is also platform independent and requires no additional DLL files (unlike MYSQL and SQLITE). XML content is also easily readable with any text editor and for any developer skill level. XML is simple, not many things can go wrong. XML can be backed up easily. XML also supports Queries and Updates to data sets by using the XQUERY language. Other popular online games do just fine without MYSQL as well (like Minecraft). That being said, the database basically consists of 3 functions that can easily be modified to use any other database system.
     
    davbar9 likes this.
  34. vis2k

    vis2k

    Joined:
    Sep 4, 2015
    Posts:
    3,141
    Hey,
    does the monster happen in "Server & Play" mode or in client mode where you just login?

    The loot thing is fixed in V1.3, will be released soon.
     
    JBR-games likes this.
  35. tequyla

    tequyla

    Joined:
    Jul 22, 2012
    Posts:
    322
    Server & play mode
     
  36. vis2k

    vis2k

    Joined:
    Sep 4, 2015
    Posts:
    3,141
    Ok, in the Editor or in the Build? And how exactly can I reproduce it? How do you make the monster run away from the player? Or do you just double click a monster far away and then the player runs towards it without the animation?
    Also did you change the animation code in any way?
     
  37. nixter

    nixter

    Joined:
    Mar 17, 2012
    Posts:
    319
    Area of Interest is like zoning, dividing up an MMO world into areas and only sending clients the relevant updates. Since uMMORPG only supports a single scene, it is vital to limit the update traffic. I found a lot of PDFs on the subject online but here are some overviews:

    http://appwarps2.shephertz.com/dev-center/mmo-interest-management/
    https://doc.photonengine.com/en/onpremise/current/reference/mmo/mmo-concept


    ----

    I'm still having trouble testing your demo with multiple accounts. To test it I:

    1) Create a Name and Pass
    2) Click Login, wait as it connects, then nothing happens
    3) Click Sever & Play
    4) Create a character and select them
    5) Arrive in the world alone
    6) Repeat steps 1-4 with another client. Also arrive in the world alone.

    What am I doing wrong?

    ----

    On the subject of in-world items I understand your reasoning. On the spectrum of Theme Park (WoW) vs. Sandbox (Minecraft) you are leaning towards the former. Giving players the ability to manipulate the environment can break down quickly the larger the server is. However, if your only concern is item content creation there are two alternatives:

    Icon extrusion - In Minecraft, items dropped in the world use their 2D GUI icon. The Icons use a default shader that extrudes them giving them the illusion of depth. They then float and rotate in the air until picked up by the nearest bystander.

    Generic Bag - In Bioware's Neverwinter Nights and many ARPGs, all items can be dropped in the world but are represented with a generic bag model. Placing a cursor over the bag displays what it is, but custom models are not needed. Interested parties click on the bag to pick up the item.

    If you decide against both of these, I would implore you to have a player-to-player trading system. Not necessarily a full auction house (although that would nice), but at least two adjacent players should be able to trade items with each other. To not have that would severely limit any point of having multiplayer. OK, rant off. :)
     
    tequyla likes this.
  38. vis2k

    vis2k

    Joined:
    Sep 4, 2015
    Posts:
    3,141
    Hey,
    about the area of interest: we get that for free because UNET has observers + NetworkProximityCheckers, so players only get updates from other NetworkIdentities within a certain range. That's really cool actually, one of the reasons why I love UNET so much.

    About the WebGL demo: in Windows/Mac/Linux builds you would select Server & Play with "admin" in one instance, hence start the server and play on it. Then you would just click "Login" with something like "admin2" in order to connect to the server, which then has two players on it. I just tested it in WebGL and I am really not sure if you are actually supposed to be able to connect to a server running in WebGL from another WebGL instance. There might be some sandboxing going on, I will have to read up on that or find out if that's actually supposed to work with UNET. It doesn't give any errors as it seems, it just doesn't find the other server (which works fine if you use 2 Windows/Mac/Linux builds though).

    About the Items: thanks for the info, both seem rather easy to do. I am still hesitant to implement those because of the performance overhead of Instantiating items for hundreds of dying monsters. Although gameplay wise I can see myself liking it more. Will see if there if there is some CPU power left when everything is done!

    Player to player trading is sure necessary, you are right. I added this to the roadmap in the first post.

    Small Progress Info: I finished all features from V1.3 today, it will be submitted to the store as soon as V1.2 was accepted.
     
  39. vis2k

    vis2k

    Joined:
    Sep 4, 2015
    Posts:
    3,141
    Update: V1.2 was just released to the Asset Store. Changes can be seen in first post!
     
  40. takapi

    takapi

    Joined:
    Jun 8, 2013
    Posts:
    79
    Hi. :)
    I have the server of VPS.
    and I have started the uMMORPG v1.2 in my server.
    however, it has two errors.
    What should I do ?

    IndexOutOfRangeException: NetworkReader:ReadBytes out of range: (5726) NetBuf sz:4 pos:2
    UnityEngine.Networking.NetBuffer.ReadBytes (System.Byte[] buffer, UInt32 count) (at C:/buildslave/unity/build/Extensions/Networking/Runtime/NetworkBuffer.cs:45)
    UnityEngine.Networking.NetworkReader.ReadString () (at C:/buildslave/unity/build/Extensions/Networking/Runtime/NetworkReader.cs:302)
    Entity.OnDeserialize (UnityEngine.Networking.NetworkReader reader, Boolean initialState)
    Monster.OnDeserialize (UnityEngine.Networking.NetworkReader reader, Boolean initialState)
    UnityEngine.Networking.NetworkIdentity.OnUpdateVars (UnityEngine.Networking.NetworkReader reader, Boolean initialState) (at C:/buildslave/unity/build/Extensions/Networking/Runtime/NetworkIdentity.cs:742)
    UnityEngine.Networking.ClientScene.ApplySpawnPayload (UnityEngine.Networking.NetworkIdentity uv, Vector3 position, System.Byte[] payload, NetworkInstanceId netId, UnityEngine.GameObject newGameObject) (at C:/buildslave/unity/build/Extensions/Networking/Runtime/ClientScene.cs:473)
    UnityEngine.Networking.ClientScene.OnObjectSpawnScene (UnityEngine.Networking.NetworkMessage netMsg) (at C:/buildslave/unity/build/Extensions/Networking/Runtime/ClientScene.cs:584)
    UnityEngine.Networking.NetworkConnection.HandleReader (UnityEngine.Networking.NetworkReader reader, Int32 receivedSize, Int32 channelId) (at C:/buildslave/unity/build/Extensions/Networking/Runtime/NetworkConnection.cs:424)
    UnityEngine.Networking.NetworkConnection.HandleBytes (System.Byte[] buffer, Int32 receivedSize, Int32 channelId) (at C:/buildslave/unity/build/Extensions/Networking/Runtime/NetworkConnection.cs:380)
    UnityEngine.Networking.NetworkConnection.TransportRecieve (System.Byte[] bytes, Int32 numBytes, Int32 channelId) (at C:/buildslave/unity/build/Extensions/Networking/Runtime/NetworkConnection.cs:530)
    UnityEngine.Networking.NetworkClient.Update () (at C:/buildslave/unity/build/Extensions/Networking/Runtime/NetworkClient.cs:648)
    UnityEngine.Networking.NetworkClient.UpdateClients () (at C:/buildslave/unity/build/Extensions/Networking/Runtime/NetworkClient.cs:861)
    UnityEngine.Networking.NetworkIdentity.UNetStaticUpdate () (at C:/buildslave/unity/build/Extensions/Networking/Runtime/NetworkIdentity.cs:1035)



    IndexOutOfRangeException: ReadString() too long: 42029
    UnityEngine.Networking.NetworkReader.ReadString () (at C:/buildslave/unity/build/Extensions/Networking/Runtime/NetworkReader.cs:294)
    SyncListItem.DeserializeItem (UnityEngine.Networking.NetworkReader reader)
    Unity.GeneratedNetworkCode._ReadStructSyncListItem_None (UnityEngine.Networking.NetworkReader reader)
    Monster.OnDeserialize (UnityEngine.Networking.NetworkReader reader, Boolean initialState)
    UnityEngine.Networking.NetworkIdentity.OnUpdateVars (UnityEngine.Networking.NetworkReader reader, Boolean initialState) (at C:/buildslave/unity/build/Extensions/Networking/Runtime/NetworkIdentity.cs:742)
    UnityEngine.Networking.ClientScene.ApplySpawnPayload (UnityEngine.Networking.NetworkIdentity uv, Vector3 position, System.Byte[] payload, NetworkInstanceId netId, UnityEngine.GameObject newGameObject) (at C:/buildslave/unity/build/Extensions/Networking/Runtime/ClientScene.cs:473)
    UnityEngine.Networking.ClientScene.OnObjectSpawnScene (UnityEngine.Networking.NetworkMessage netMsg) (at C:/buildslave/unity/build/Extensions/Networking/Runtime/ClientScene.cs:584)
    UnityEngine.Networking.NetworkConnection.HandleReader (UnityEngine.Networking.NetworkReader reader, Int32 receivedSize, Int32 channelId) (at C:/buildslave/unity/build/Extensions/Networking/Runtime/NetworkConnection.cs:424)
    UnityEngine.Networking.NetworkConnection.HandleBytes (System.Byte[] buffer, Int32 receivedSize, Int32 channelId) (at C:/buildslave/unity/build/Extensions/Networking/Runtime/NetworkConnection.cs:380)
    UnityEngine.Networking.NetworkConnection.TransportRecieve (System.Byte[] bytes, Int32 numBytes, Int32 channelId) (at C:/buildslave/unity/build/Extensions/Networking/Runtime/NetworkConnection.cs:530)
    UnityEngine.Networking.NetworkClient.Update () (at C:/buildslave/unity/build/Extensions/Networking/Runtime/NetworkClient.cs:648)
    UnityEngine.Networking.NetworkClient.UpdateClients () (at C:/buildslave/unity/build/Extensions/Networking/Runtime/NetworkClient.cs:861)
    UnityEngine.Networking.NetworkIdentity.UNetStaticUpdate () (at C:/buildslave/unity/build/Extensions/Networking/Runtime/NetworkIdentity.cs:1035)
     
  41. vis2k

    vis2k

    Joined:
    Sep 4, 2015
    Posts:
    3,141
    Hey,
    did you change anything that may have caused this error? I usually get those if I have LOTS of data in the game, for example at the top post I listed a UNET bug where this error occurs if there are too many monsters, because UNET tries to send them all at once in one package. Which still should work if you use the "Reliable Fragmented" channel, but it doesn't for some reason.

    Can you try to:
    - remove all monsters from the Scene and see if it still happens
    - remove all NPCs from the Scene and see if it still happens

    We need to gather as much information as possible about this bug so that we can report it to Unity and get it fixed fast (or learn what we have to change to avoid it).

    Greetings
     
  42. takapi

    takapi

    Joined:
    Jun 8, 2013
    Posts:
    79
    Hi, :)
    I changed the localhost to my server IP address.
    and I also changed the port number.
     
  43. vis2k

    vis2k

    Joined:
    Sep 4, 2015
    Posts:
    3,141
    Ok. Did you try to remove monsters and NPCs from the Scene? Also: which Unity version do you use? Did you try the latest one? Maybe even the latest patch release?
     
  44. JessieK

    JessieK

    Joined:
    Feb 4, 2014
    Posts:
    148
    Hey I was curious because I don't see anything about it here, do you have any plans for a levelling/skill system of some kind?
     
  45. vis2k

    vis2k

    Joined:
    Sep 4, 2015
    Posts:
    3,141
    Hey,
    Levels and Skills are implemented already. New skills can be learned if the player has the required level and enough skill experience points.

    Progress Info: V1.3 was submitted to the Asset Store, should be released soon!
     
    Last edited: Jan 9, 2016
  46. takapi

    takapi

    Joined:
    Jun 8, 2013
    Posts:
    79
    I didn't try to remove monsters and NPCs from the Scene.
    I use Unity version 5.3.0f4.
     
  47. vis2k

    vis2k

    Joined:
    Sep 4, 2015
    Posts:
    3,141
    Okay, could you try to remove them from the Scene and see what happens? Also Unity 5.3.1 might be worth a try.

    Greetings
     
  48. takapi

    takapi

    Joined:
    Jun 8, 2013
    Posts:
    79
    I updated the Unity version.(5.3.1f1)
    and The uMMORPG has this errors.
    It is 5.3.1p2 of Unity version when it took a screen shot of the third piece(
    zSS(160113-043142-99).jpg)
    .

    In uMMORPG1.1, uMMORPG did not have such a problem.
    uMMORPG1.1 worked in my VPS.
    I feel disappointed. :(
     

    Attached Files:

    Last edited: Jan 12, 2016
  49. vis2k

    vis2k

    Joined:
    Sep 4, 2015
    Posts:
    3,141
    Hey,
    thanks for the Screenshots. The first one with the Invalid AABB is a Unity error. I used to get that only in the Animator in 5.3.0 but in 5.3.1 I also get it on start. It doesn't matter though, everything still works fine after the error and I am sure they will fix it soon.

    The NetworkReader ReadBytes out of range and ReadString too long errors are UNET bugs, I listed them in the first post. You can see that I never actually use ReadBytes in my code, and that no String is 42029 characters long (which would be crazy). The 'can't find sync target' happens because of the previous UNET bug.

    I asked to remove the monsters and the npcs from the game so that we can track that error down and report it to Unity as fast as possible. Do you have Network Simulation enabled or disabled? Also does this error only happen on your VPS and not in the Editor when you try it on your computer? Also does it happen over the local network? V1.3 was just released on the store, please try that version too.


    Update: V1.3 is now in the Asset Store! Changes can be seen in the first post.
     
  50. tequyla

    tequyla

    Joined:
    Jul 22, 2012
    Posts:
    322
    Hello,

    the price is raising by +10E while you write uMMORPG is under active development and there are a lot more features to come!

    the community help you to debug your stuff.

    why ?

    ++