@startuml entity
class Lgende{
    - private
    # protected
    + public
    {abstract} abstract
    {static} static
}
package entity{
    abstract class Entity #888888{
        + Entity(Point3D):Entity
        ==
        - id:String
        + getId():String
        --
        # position:Point3D
        + getPosition():Point3D
        --
        # collisionBox:CollisionBox
        + getCollisionBox():CollisionBox
        --
        # component:Component
        # {abstract} buildComponent():Component
        + getComponent():Component
        --
        # update(double):void
        # fall():void
        # correctCollisions():void
        --
        onMouseEntered(MouseEvent):void
        onMouseExit(MouseEvent):void
    }
    interface 2DComponentOwner{
        + build2DComponent():2DComponent
    }
    package entity.item{
        class Item
        Item --|> Entity
    }
    package entity.living{
        abstract class LivingEntity{
            # hp:double
            # xpReward:double
            ==
            # move():void
            + getAttacked(double, LivingEntity):void
            # onDeath():void
            # jump():void
            ==
            # setUp(boolean):void
            # setDown(boolean):void
            # setLeft(boolean):void
            # setRight(boolean):void
        }
        LivingEntity --|> Entity
        package entity.living.animal{
            abstract class Animal{
                # nanosecondsWhenStateWasChosen:long
                # state:State
                # running:boolean
                # walking:boolean
                # {abstract}shouldChangeState():boolean
                # {abstract}chooseNextState():State
                # updateState():void
                # startWalkingTo(Point3D):void
                # startRunningTo(Point3D):void
                'the following method should be used to check if the prey is moving,
                'in the event that a predator would be after it. 
                + getState():State
            }
            Animal --|> LivingEntity
        }
        package entity.living.human{
            abstract class Human{
                - Level:int
                + getLevel():int
                + stats:Hashtable<String, double>
                + itemsStatModifiers:Hashtable<String, double>
                ==
                + tradeItem(Item, Human):Item
                ==
                - wornItems:ArrayList<Item>
                + getWornItems():ArrayList<Item>
                --
                - currentWeapon:Weapon
                + getCurrentWeapon():Weapon
            }
            Human --|> LivingEntity
            Human --|> 2DComponentOwner
        }
    }
    package entity.static{
        class StaticEntity
        StaticEntity --|> Entity
    }
}
package javafx{
    package javafx.scene{
        class Group
    }
}
package visual{
    class Component{
        - id:string
        + Component(String):Component
        + getId():String
    }
    Component --|> Group
    Entity <-- Component

    class 2DComponent{
        - visible:boolean
        + isVisible():boolean

    }
    2DComponent --|> Component
}
@enduml