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]]]]