~melchizedek6809/WolkenWelten

75c69c75e8c1f3cee2e705945a85887fadfe62c4 — Ben (Win10) 1 year, 5 months ago b2bf2b9
WIP: item drops
A client/sfx/chomp.aif => client/sfx/chomp.aif +0 -0
A client/sfx/nibble.aif => client/sfx/nibble.aif +0 -0
M client/src/mods/input.nuj => client/src/mods/input.nuj +40 -35
@@ 11,17 11,17 @@
[def throw-start 0]

[defun player-blockbreak! []
       [when [zero? input/primary-did-count]
             [def p [player-raycast #f]]
             [when p [message/send 0 [list :blockbreaker p]]
                     [player-do-primary! count]]]]
  [when [zero? input/primary-did-count]
    [def p [player-raycast #f]]
    [when p [message/send 0 [list :blockbreaker p]]
          [player-do-primary! count]]]]

[defun player-primary! []
       "Make the player do a primary action"
       [if [cons-mode?]
           [player-blockbreak! input/primary-did-count]
           [inventory/primary! input/primary-did-count]]
       [set! input/primary-did #t]]
  "Make the player do a primary action"
  [if [cons-mode?]
      [player-blockbreak! input/primary-did-count]
      [inventory/primary! input/primary-did-count]]
  [set! input/primary-did #t]]

[defun player-secondary! []
  "Make the player do a secondary action"


@@ 31,29 31,34 @@
  [set! input/secondary-did #t]]

[defun player-tertiary! []
       "Make the player do a tertiary action"
       [inventory/tertiary!]
       #;[item-tertiary! 0 input/tertiary-did-count]
       [set! input/tertiary-did #t]]

[defun input-tick []
       "Evals all Input handlers in order"
       [input-mouse-tick]
       [input-keyboard-tick]
       [hook/tick]

       [++ input/primary-did-count]
       [when-not input/primary-did
                 [player-stop-mining!]
                 [set! input/primary-did-count 0]]
       [set! input/primary-did #f]

       [++ input/secondary-did-count]
       [when-not input/secondary-did
                 [set! input/secondary-did-count 0]]
       [set! input/secondary-did #f]

       [++ input/tertiary-did-count]
       [when-not input/tertiary-did
                 [set! input/tertiary-did-count 0]]
       [set! input/tertiary-did #f]]
  "Make the player do a tertiary action"
  [inventory/tertiary!]
  #;[item-tertiary! 0 input/tertiary-did-count]
  [set! input/tertiary-did #t]]

[defun player-drop! []
  "Drop whatever the player is holding"
  [when-not blockchooser/active
            [inventory/drop!]]]

  [defun input-tick []
    "Evals all Input handlers in order"
    [input-mouse-tick]
    [input-keyboard-tick]
    [hook/tick]

    [++ input/primary-did-count]
    [when-not input/primary-did
              [player-stop-mining!]
              [set! input/primary-did-count 0]]
    [set! input/primary-did #f]

    [++ input/secondary-did-count]
    [when-not input/secondary-did
              [set! input/secondary-did-count 0]]
    [set! input/secondary-did #f]

    [++ input/tertiary-did-count]
    [when-not input/tertiary-did
              [set! input/tertiary-did-count 0]]
    [set! input/tertiary-did #f]]

M client/src/mods/input_keyboard.nuj => client/src/mods/input_keyboard.nuj +1 -0
@@ 178,6 178,7 @@
         [when [input-keyboard-state key-space] [player-jump-hook!]]
         [when [input-keyboard-state key-r]     [player-tertiary!]]
         [when [input-keyboard-state key-v]     [player-crouch!]]
         [when [input-keyboard-state key-q]     [player-drop!]]
         [player-sneak! [input-keyboard-state key-v]]
         [player-boost! [input-keyboard-state key-lshift]]]]]


M client/src/mods/inventory.nuj => client/src/mods/inventory.nuj +5 -1
@@ 1,4 1,4 @@
[def inventory/selection 3]
 [def inventory/selection 3]
[def inventory [array/allocate 10]]
[def inventory/tile-size 64]
[def inventory/panel/widget #nil]


@@ 151,4 151,8 @@
            [inventory/panel/update!]
            [blockchooser/refresh]]]]]

[defun inventory/drop! []
  [def item [inventory/get-active]]
  [and item [_ item :drop [player-pos] [player-rot] 1.0 1]]]

[event-bind on-join :inventory inventory/w/init!]

M client/src/mods/server-eval.nuj => client/src/mods/server-eval.nuj +1 -1
@@ 1,2 1,2 @@
[defhandler :client-environments-reply [client-id msg]
  [log [cat [ansi-blue "> "][cadr msg]]]]
  [log [cat [ansi-blue "> "] [cadr msg]]]]

M common/src/mods/item.nuj => common/src/mods/item.nuj +18 -13
@@ 15,11 15,17 @@
[defmethod <item> :tertiary [] #f]
[defmethod <item> :get-quantity [] #nil]
[defmethod <item> :set-quantity [] #nil]
[defmethod <item> :collision [] #f]

[defmethod <item> :serialize []
           [str/write [-> [tree/dup this]
                          [tree/set! :classname [list quote [tree/get this :classname]]]
                          [tree/set! :parent '<item>]]]]
           [-> [tree/dup this]
               [tree/set! :name [list 'quote [or [tree/get this :name] '<unknown-item>]]]
               [tree/set! :parent [tree/get [tree/get this :parent] :name]]]]

[defmethod <item> :drop [pos rot force amount]
           [if client?
               [message/send 0 [list :item-drop pos rot force amount [_ this :serialize]]]
               [item-drop! this pos rot force amount]]]

[defmethod <item> :gui-sprite [] 258]
[defmethod <item> :gui-count [] 44]


@@ 33,11 39,12 @@
           [tree/set! this :quantity new-quantity]]

[defobject <pear> <item>]
[defmethod <pear> :name [] "Pear"]
[defproperty <pear> :power 1]
[defmethod <pear> :item-name [] "Pear"]
[defmethod <pear> :gui-sprite [] 258]
[defmethod <pear> :secondary [] [action-every 1000
                                              [player-hp! [player-maxhp]]
                                              [sfx-play sfx-hoo]
                                              [sfx-play sfx-chomp]
                                              [say [ansi-green "Yum!"]]]]

[defobject <grenade> <stackable-item>]


@@ 45,20 52,18 @@
[defproperty <grenade> :power 3]
[defmethod <grenade> :gui-sprite []
           256]
[defmethod <grenade> :name [] "Grenade"]
[defmethod <grenade> :item-name [] "Grenade"]
[defmethod <grenade> :primary []
           [item-use-up 20 [pear/shoot! :pear-shoot]]]

           [item-use-up 200 [pear/shoot! :pear-shoot]]]
[defmethod <grenade> :tertiary [] [say [ansi-green "Can do!"]] #f]

[defmethod <grenade> :collision []
#;[defmethod <grenade> :collision []
           [def ent [tree/get this :entity]]
           [explode [entity/pos ent] [tree/get this :power]]
           [entity/delete ent]]

[defobject <bomb> <grenade>]
[defmethod <bomb> :name [] "Bomb"]
[defmethod <bomb> :item-name [] "Bomb"]
[defmethod <bomb> :gui-sprite [] 257]
[defmethod <bomb> :primary []
           [item-use-up 200 [pear/shoot! :mega-pear-shoot]]]
#;[defmethod <bomb> :primary []
           [item-use-up 500 [pear/shoot! :mega-pear-shoot]]]
[defmethod <bomb> :tertiary [] [say [ansi-red "Can't do that!"]] #t]

M common/src/mods/nos.nuj => common/src/mods/nos.nuj +1 -1
@@ 1,5 1,5 @@
[defun nos/deserialize [v]
  [eval [read/single v]]]
  [eval v]]

[defun entity/bind-to-object [o ent]
  [entity/handler! ent [\ msg

A server/src/mods/item.nuj => server/src/mods/item.nuj +14 -0
@@ 0,0 1,14 @@
[defun item-drop! [this pos rot force amount]
  [tree/set! this :entity [-> [entity/new*]
                              [entity/pos! pos]
                              [entity/rotation! [- rot]]
                              [entity/velocity! [* [vec/rot->vel rot] [* 0.05 [vec force]]]]
                              [entity/flags! 0]]]
  [entity/bind-to-object this [tree/get this :entity]]]

[defun item-drop-new [pos rot force amount data]
  [def obj [nos/deserialize data]]
  [_ obj :drop [eval pos] [eval rot] force amount]]

[defhandler :item-drop [sender msg]
            [apply item-drop-new [cdr msg]]]

M server/src/mods/pear.nuj => server/src/mods/pear.nuj +7 -7
@@ 2,15 2,15 @@
       [explode! pos pow 0]
       [message/send -1 [list :effect/explosion pos pow]]]

[defobject <pear> <item>]
[defproperty <pear> :name "Unknown Pear"]
[defproperty <pear> :power 3]
[defmethod <pear> :collision []
[defobject <pear-bomb> <item>]
[defproperty <pear-bomb> :name "Unknown Pear"]
[defproperty <pear-bomb> :power 3]
[defmethod <pear-bomb> :collision []
  [def ent [tree/get this :entity]]
  [explode [entity/pos ent] [tree/get this :power]]
  [entity/delete ent]]

[defmethod <pear> :shoot [pos rot]
[defmethod <pear-bomb> :shoot [pos rot]
  [tree/set! this :entity [-> [entity/new*]
                              [entity/pos! pos]
                              [entity/rotation! [- rot]]


@@ 18,14 18,14 @@
                              [entity/flags! 0]]]
  [entity/bind-to-object this [tree/get this :entity]]]

[defobject <mega-pear> <pear>]
[defobject <mega-pear> <pear-bomb>]
[defproperty <mega-pear> :power 7]

[defun pear/new! [class pos rot]
  [_ [make-instance class] :shoot pos rot]]

[defhandler :pear-shoot [sender msg]
  [pear/new! <pear>
  [pear/new! <pear-bomb>
             [eval [cadr msg]]
             [eval [caddr msg]]]]