diff options
| author | historia <[not public]> | 2026-09-18 15:16:44 -0400 |
|---|---|---|
| committer | historia <[not public]> | 2026-09-18 15:16:44 -0400 |
| commit | 7eab582d8a8ee2af1a6baae7baf0696c7005de2e (patch) | |
| tree | 902bbc8c6e39c9f62f779ca23267714ec420b9f5 /internal/game/act_gather.go | |
| parent | 153acb7f644d755c45533b7c5311e3ffa47e8973 (diff) | |
| download | thehouseoficarus-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.go | 37 |
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) } |
