aboutsummaryrefslogtreecommitdiff
path: root/internal/game/act_gather.go
diff options
context:
space:
mode:
authorhistoria <[not public]>2026-09-18 15:16:44 -0400
committerhistoria <[not public]>2026-09-18 15:16:44 -0400
commit7eab582d8a8ee2af1a6baae7baf0696c7005de2e (patch)
tree902bbc8c6e39c9f62f779ca23267714ec420b9f5 /internal/game/act_gather.go
parent153acb7f644d755c45533b7c5311e3ffa47e8973 (diff)
downloadthehouseoficarus-7eab582d8a8ee2af1a6baae7baf0696c7005de2e.tar.gz
fix: harden triggers, economy, casino, world data, and admin/net paths
Diffstat (limited to 'internal/game/act_gather.go')
-rw-r--r--internal/game/act_gather.go37
1 files changed, 9 insertions, 28 deletions
diff --git a/internal/game/act_gather.go b/internal/game/act_gather.go
index a1c87b9..08ffbb1 100644
--- a/internal/game/act_gather.go
+++ b/internal/game/act_gather.go
@@ -110,10 +110,6 @@ func (g *Game) startGather(sess *net.Session, p *player.Player, obj *object.Obje
}
}
- if p.FirstFreeSlot() == -1 {
- sess.WriteLine("Your inventory is too full!")
- return
- }
verb := cfg.Skill
switch cfg.Skill {
case "woodcutting":
@@ -162,11 +158,6 @@ func (g *Game) advanceGather(sess *net.Session, p *player.Player) {
shared := d.DepleteTimer
if step == 0 {
- if p.FirstFreeSlot() == -1 {
- sess.WriteLine(g.colorize(sess, "error", "Your inventory is too full!"))
- g.cancelAction(p)
- return
- }
if cfg.Bait != "" {
if !p.HasItem(cfg.Bait) {
baitName := cfg.Bait
@@ -216,13 +207,6 @@ func (g *Game) advanceGather(sess *net.Session, p *player.Player) {
eligible = filterDropsByTool(eligible, d.ToolType, len(cfg.Tools))
drop := behavior.ResolveDrop(g.DataDir, eligible)
if drop != nil {
- freeSlot := p.FirstFreeSlot()
- if freeSlot == -1 {
- sess.WriteLine(g.colorize(sess, "error", "Your inventory is too full!"))
- g.cancelAction(p)
- return
- }
-
qty := drop.Quantity
if qty <= 0 {
qty = 1
@@ -234,7 +218,14 @@ func (g *Game) advanceGather(sess *net.Session, p *player.Player) {
itemName = itemDef.Name
}
- p.SetInvSlot(freeSlot, &player.InventorySlot{ItemID: drop.ItemID, Quantity: qty})
+ // Stack-aware placement: a stackable drop merges into an existing
+ // stack, so a full inventory with a matching stack is not a failure
+ // (matching doGet/shop/bank withdrawal).
+ if !placeCraftOutput(p, drop.ItemID, itemDef, qty) {
+ sess.WriteLine(g.colorize(sess, "error", "Your inventory is too full!"))
+ g.cancelAction(p)
+ return
+ }
xp := drop.XP
if xp > 0 {
g.awardSkillXP(sess, p, player.SkillName(cfg.Skill), xp)
@@ -254,7 +245,7 @@ func (g *Game) advanceGather(sess *net.Session, p *player.Player) {
}
sess.WriteLine(msg)
- g.checkBirdNest(sess, p, cfg, freeSlot)
+ g.checkBirdNest(sess, p, cfg, -1)
if shared {
st := g.World.GetObjStateByKey(instanceKey)
@@ -306,11 +297,6 @@ func (g *Game) advanceGather(sess *net.Session, p *player.Player) {
return
}
- if p.FirstFreeSlot() == -1 {
- sess.WriteLine(g.colorize(sess, "error", "Your inventory is too full!"))
- g.cancelAction(p)
- return
- }
d.Step = 0
p.Action.WaitLeft = engine.ToTicks(wait)
return
@@ -318,11 +304,6 @@ func (g *Game) advanceGather(sess *net.Session, p *player.Player) {
}
sess.WriteLine(cfg.FailMessage)
- if p.FirstFreeSlot() == -1 {
- sess.WriteLine(g.colorize(sess, "error", "Your inventory is too full!"))
- g.cancelAction(p)
- return
- }
d.Step = 0
p.Action.WaitLeft = engine.ToTicks(wait)
}