diff --git a/client/src/components/instance.constructs.jsx b/client/src/components/instance.constructs.jsx index cd6e4b3d..b69e69bd 100644 --- a/client/src/components/instance.constructs.jsx +++ b/client/src/components/instance.constructs.jsx @@ -19,6 +19,7 @@ const addState = connect( account, itemInfo, itemEquip, + itemUnequip, navInstance, vboxSelected, tutorial, @@ -36,14 +37,20 @@ const addState = connect( return ws.sendVboxUnequip(instance.id, constructId, item); } + function sendVboxUnequipApply(targetConstructId) { + return ws.sendVboxUnequipApply(instance.id, itemUnequip[0], itemUnequip[1], targetConstructId); + } + return { instance, player, account, sendVboxAcceptEquip, + sendVboxUnequipApply, sendVboxApply, itemInfo, itemEquip, + itemUnequip, navInstance, sendUnequip, vboxSelected, @@ -83,6 +90,7 @@ function Construct(props) { construct, iter, itemEquip, + itemUnequip, instance, mobileVisible, player, @@ -93,13 +101,13 @@ function Construct(props) { // Function Calls sendVboxApply, sendVboxAcceptEquip, + sendVboxUnequipApply, sendUnequip, setActiveConstruct, setItemUnequip, setItemEquip, setInfo, } = props; - const { vbox } = player; const duplicateSkill = construct.skills.length !== 0 && construct.skills.every(sk => { @@ -108,15 +116,16 @@ function Construct(props) { return sk.skill === vbox.bound[itemEquip]; }); const tutorialDisableEquip = tutorialShouldDisableEquip(tutorial, iter, instance, construct); - function onClick(e) { e.stopPropagation(); e.preventDefault(); if (duplicateSkill || tutorialDisableEquip) return true; - if (vboxSelected[0]) sendVboxAcceptEquip(construct.id); if (itemEquip !== null) sendVboxApply(construct.id, itemEquip); + if (vboxSelected[0]) sendVboxAcceptEquip(construct.id); + if (itemUnequip.length && itemUnequip[0] !== construct.id) sendVboxUnequipApply(construct.id); setItemEquip(null); - return setActiveConstruct(construct); + setItemUnequip([]); + return true; } function hoverInfo(e, info) { @@ -259,6 +268,7 @@ function Construct(props) { class InstanceConstructs extends preact.Component { shouldComponentUpdate(newProps) { if (newProps.itemEquip !== this.props.itemEquip) return true; + if (newProps.itemUnequip !== this.props.itemUnequip) return true; if (newProps.tutorial !== this.props.tutorial) return true; if (newProps.navInstance !== this.props.navInstance) return true; // JSON or Array objects @@ -272,6 +282,7 @@ class InstanceConstructs extends preact.Component { const { // Changing state variables itemEquip, + itemUnequip, instance, navInstance, player, @@ -284,6 +295,7 @@ class InstanceConstructs extends preact.Component { setActiveConstruct, sendVboxApply, sendVboxAcceptEquip, + sendVboxUnequipApply, setVboxHighlight, setItemUnequip, setItemEquip, @@ -301,12 +313,14 @@ class InstanceConstructs extends preact.Component { iter: i, construct: player.constructs[i], itemEquip, + itemUnequip, instance, setItemUnequip, setItemEquip, player, sendVboxApply, sendVboxAcceptEquip, + sendVboxUnequipApply, setInfo, setActiveConstruct, itemInfo, diff --git a/client/src/socket.jsx b/client/src/socket.jsx index f25f6fa1..af3ece81 100644 --- a/client/src/socket.jsx +++ b/client/src/socket.jsx @@ -93,6 +93,10 @@ function createSocket(events) { send(['VboxUnequip', { instance_id: instanceId, construct_id: constructId, target }]); } + function sendVboxUnequipApply(instanceId, constructId, target, targetConstructId) { + send(['VboxUnequipApply', { instance_id: instanceId, construct_id: constructId, target, target_construct_id: targetConstructId }]); + } + function sendVboxDiscard(instanceId) { send(['VboxDiscard', { instance_id: instanceId }]); } @@ -386,6 +390,7 @@ function createSocket(events) { sendVboxCombine, sendVboxDiscard, sendVboxUnequip, + sendVboxUnequipApply, sendItemInfo, diff --git a/server/src/instance.rs b/server/src/instance.rs index 174b225b..5dc79652 100644 --- a/server/src/instance.rs +++ b/server/src/instance.rs @@ -501,10 +501,10 @@ impl Instance { Ok(self) } - pub fn vbox_unequip(mut self, account: Uuid, target: Item, construct_id: Uuid) -> Result { + pub fn vbox_unequip(mut self, account: Uuid, target: Item, construct_id: Uuid, target_construct_id: Option) -> Result { self.vbox_action_allowed(account)?; self.account_player(account)? - .vbox_unequip(target, construct_id)?; + .vbox_unequip(target, construct_id, target_construct_id)?; Ok(self) } } diff --git a/server/src/player.rs b/server/src/player.rs index fe62846e..0e0baf56 100644 --- a/server/src/player.rs +++ b/server/src/player.rs @@ -324,8 +324,8 @@ impl Player { Ok(self) } - pub fn vbox_unequip(&mut self, target: Item, construct_id: Uuid) -> Result<&mut Player, Error> { - if self.vbox.bound.len() >= 9 { + pub fn vbox_unequip(&mut self, target: Item, construct_id: Uuid, target_construct_id: Option) -> Result<&mut Player, Error> { + if self.vbox.bound.len() >= 9 && !target_construct_id.is_some() { return Err(err_msg("too many items bound")); } @@ -358,7 +358,12 @@ impl Player { } self.vbox.bound.push(target); - self.vbox.bound.sort_unstable(); + + if target_construct_id.is_some() { + let equip_index = self.vbox.bound.len() - 1; + self.vbox_apply(equip_index, target_construct_id.expect("no construct"))?; + } + // self.vbox.bound.sort_unstable(); Ok(self) } diff --git a/server/src/rpc.rs b/server/src/rpc.rs index 90a4320e..253f6bcb 100644 --- a/server/src/rpc.rs +++ b/server/src/rpc.rs @@ -118,6 +118,7 @@ pub enum RpcRequest { VboxCombine { instance_id: Uuid, indices: Vec }, VboxApply { instance_id: Uuid, construct_id: Uuid, index: usize }, VboxUnequip { instance_id: Uuid, construct_id: Uuid, target: Item }, + VboxUnequipApply { instance_id: Uuid, construct_id: Uuid, target: Item, target_construct_id: Uuid }, VboxReclaim { instance_id: Uuid, index: usize }, } @@ -254,7 +255,10 @@ impl Connection { Ok(RpcMessage::InstanceState(vbox_reclaim(&mut tx, account, instance_id, index)?)), RpcRequest::VboxUnequip { instance_id, construct_id, target } => - Ok(RpcMessage::InstanceState(vbox_unequip(&mut tx, account, instance_id, construct_id, target)?)), + Ok(RpcMessage::InstanceState(vbox_unequip(&mut tx, account, instance_id, construct_id, target, None)?)), + + RpcRequest::VboxUnequipApply { instance_id, construct_id, target, target_construct_id } => + Ok(RpcMessage::InstanceState(vbox_unequip(&mut tx, account, instance_id, construct_id, target, Some(target_construct_id))?)), RpcRequest::MtxConstructSpawn {} => Ok(RpcMessage::ConstructSpawn(mtx::new_construct(&mut tx, account)?)), diff --git a/server/src/vbox.rs b/server/src/vbox.rs index 73356c13..3488b14d 100644 --- a/server/src/vbox.rs +++ b/server/src/vbox.rs @@ -205,9 +205,9 @@ pub fn vbox_apply(tx: &mut Transaction, account: &Account, instance_id: Uuid, co return instance_update(tx, instance); } -pub fn vbox_unequip(tx: &mut Transaction, account: &Account, instance_id: Uuid, construct_id: Uuid, target: Item) -> Result { +pub fn vbox_unequip(tx: &mut Transaction, account: &Account, instance_id: Uuid, construct_id: Uuid, target: Item, target_construct_id: Option) -> Result { let instance = instance_get(tx, instance_id)? - .vbox_unequip(account.id, target, construct_id)?; + .vbox_unequip(account.id, target, construct_id, target_construct_id)?; return instance_update(tx, instance); }