载入中...
搜索中...
未找到
Inventory.cpp
浏览该文件的文档.
2#include "inventory/Item.h"
4
5#include <simplesquirrel/simplesquirrel.hpp>
6
7namespace eve::inventory {
8
10
11int Inventory::registerItemsFromJson(const std::string &json) {
13 return ItemRegistry::loadFromJson(json, nullptr);
14}
15
17
19
20bool Inventory::hasItemDefinition(const std::string &itemId) {
21 return ItemRegistry::find(itemId) != nullptr;
22}
23
24std::string Inventory::getItemDisplayName(const std::string &itemId) {
25 const auto *def = ItemRegistry::find(itemId);
26 return def ? def->displayName : std::string{};
27}
28
29int Inventory::getItemMaxStack(const std::string &itemId) {
30 const auto *def = ItemRegistry::find(itemId);
31 return def ? def->maxStack : 0;
32}
33
34float Inventory::getItemWeight(const std::string &itemId) {
35 const auto *def = ItemRegistry::find(itemId);
36 return def ? def->weight : 0.f;
37}
38
39float Inventory::getItemVolume(const std::string &itemId) {
40 const auto *def = ItemRegistry::find(itemId);
41 return def ? def->volume : 0.f;
42}
43
44std::string Inventory::getItemCategory(const std::string &itemId) {
45 const auto *def = ItemRegistry::find(itemId);
46 return def ? def->category : std::string{};
47}
48
49std::string Inventory::getItemEquipSlot(const std::string &itemId) {
50 const auto *def = ItemRegistry::find(itemId);
51 return def ? def->equipSlot : std::string{};
52}
53
54bool Inventory::itemHasTag(const std::string &itemId, const std::string &tag) {
55 const auto *def = ItemRegistry::find(itemId);
56 return def ? def->hasTag(tag) : false;
57}
58
59std::string Inventory::getItemExtra(const std::string &itemId, const std::string &key,
60 const std::string &fallback) {
61 const auto *def = ItemRegistry::find(itemId);
62 return def ? def->getExtra(key, fallback) : fallback;
63}
64
65Bag *Inventory::newBag(int slotCount) {
67 return new Bag(slotCount);
68}
69
74
75int Inventory::transferItem(Bag *from, Bag *to, const std::string &itemId, int quantity) {
76 return InventorySystem::transfer(from, to, itemId, quantity);
77}
78
79int Inventory::transferSlot(Bag *from, int fromSlot, Bag *to, int quantity) {
80 return InventorySystem::transferSlot(from, fromSlot, to, quantity);
81}
82
83bool Inventory::hasAcceptRule(const std::string &name) {
85}
86
90
91bool Inventory::hasStackRule(const std::string &name) {
93}
94
96
98 return int(InventorySystem::events().size());
99}
100
101std::string Inventory::getChangeEventAction(int index) const {
102 const auto &evs = InventorySystem::events();
103 if (index < 0 || size_t(index) >= evs.size()) return {};
104 return evs[size_t(index)].action;
105}
106
107std::string Inventory::getChangeEventBagId(int index) const {
108 const auto &evs = InventorySystem::events();
109 if (index < 0 || size_t(index) >= evs.size()) return {};
110 return evs[size_t(index)].bagId;
111}
112
113std::string Inventory::getChangeEventOtherBagId(int index) const {
114 const auto &evs = InventorySystem::events();
115 if (index < 0 || size_t(index) >= evs.size()) return {};
116 return evs[size_t(index)].otherBagId;
117}
118
119std::string Inventory::getChangeEventItemId(int index) const {
120 const auto &evs = InventorySystem::events();
121 if (index < 0 || size_t(index) >= evs.size()) return {};
122 return evs[size_t(index)].itemId;
123}
124
126 const auto &evs = InventorySystem::events();
127 if (index < 0 || size_t(index) >= evs.size()) return 0;
128 return evs[size_t(index)].quantity;
129}
130
131int Inventory::getChangeEventSlot(int index) const {
132 const auto &evs = InventorySystem::events();
133 if (index < 0 || size_t(index) >= evs.size()) return -1;
134 return evs[size_t(index)].slot;
135}
136
138 const auto &evs = InventorySystem::events();
139 if (index < 0 || size_t(index) >= evs.size()) return -1;
140 return evs[size_t(index)].otherSlot;
141}
142
143std::string Inventory::getChangeEventEquipSlot(int index) const {
144 const auto &evs = InventorySystem::events();
145 if (index < 0 || size_t(index) >= evs.size()) return {};
146 return evs[size_t(index)].equipSlot;
147}
148
149void Inventory::expose(ssq::Table &table) {
150 auto cls = table.addClass(name, Inventory::create, false);
151 expose(cls);
152
153 auto bag = table.addClass<Bag>(
154 "Bag", std::function<Bag *(int)>([](int slots) -> Bag * { return new Bag(slots); }), true);
155 bag.addFunc("destroy", &Bag::destroy);
156 bag.addFunc("getId", &Bag::getId);
157 bag.addFunc("setId", &Bag::setId);
158 bag.addFunc("getKind", &Bag::getKind);
159 bag.addFunc("setKind", &Bag::setKind);
160 bag.addFunc("getSlotCount", &Bag::getSlotCount);
161 bag.addFunc("setSlotCount", &Bag::setSlotCount);
162 bag.addFunc("getMaxWeight", &Bag::getMaxWeight);
163 bag.addFunc("setMaxWeight", &Bag::setMaxWeight);
164 bag.addFunc("getMaxVolume", &Bag::getMaxVolume);
165 bag.addFunc("setMaxVolume", &Bag::setMaxVolume);
166 bag.addFunc("getAcceptRule", &Bag::getAcceptRule);
167 bag.addFunc("setAcceptRule", &Bag::setAcceptRule);
168 bag.addFunc("getCapacityPolicy", &Bag::getCapacityPolicy);
169 bag.addFunc("setCapacityPolicy", &Bag::setCapacityPolicy);
170 bag.addFunc("getStackRule", &Bag::getStackRule);
171 bag.addFunc("setStackRule", &Bag::setStackRule);
172 bag.addFunc("clearAcceptTags", &Bag::clearAcceptTags);
173 bag.addFunc("addAcceptTag", &Bag::addAcceptTag);
174 bag.addFunc("getAcceptTagCount", &Bag::getAcceptTagCount);
175 bag.addFunc("getAcceptTag", &Bag::getAcceptTag);
176 bag.addFunc("clearRejectTags", &Bag::clearRejectTags);
177 bag.addFunc("addRejectTag", &Bag::addRejectTag);
178 bag.addFunc("getRejectTagCount", &Bag::getRejectTagCount);
179 bag.addFunc("getRejectTag", &Bag::getRejectTag);
180 bag.addFunc("setExtra", &Bag::setExtra);
181 bag.addFunc("getExtra", &Bag::getExtra);
182 bag.addFunc("canAddItem", &Bag::canAddItem);
183 bag.addFunc("canAddItemReason", &Bag::canAddItemReason);
184 bag.addFunc("addItem", &Bag::addItem);
185 bag.addFunc("removeItem", &Bag::removeItem);
186 bag.addFunc("removeAt", &Bag::removeAt);
187 bag.addFunc("swapSlots", &Bag::swapSlots);
188 bag.addFunc("moveSlot", &Bag::moveSlot);
189 bag.addFunc("splitStack", &Bag::splitStack);
190 bag.addFunc("countItem", &Bag::countItem);
191 bag.addFunc("findItem", &Bag::findItem);
192 bag.addFunc("findItemByTag", &Bag::findItemByTag);
193 bag.addFunc("getUsedWeight", &Bag::getUsedWeight);
194 bag.addFunc("getUsedVolume", &Bag::getUsedVolume);
195 bag.addFunc("getUsedSlotCount", &Bag::getUsedSlotCount);
196 bag.addFunc("clear", &Bag::clear);
197 bag.addFunc("isSlotEmpty", &Bag::isSlotEmpty);
198 bag.addFunc("getSlotItemId", &Bag::getSlotItemId);
199 bag.addFunc("getSlotQuantity", &Bag::getSlotQuantity);
200 bag.addFunc("getSlotInstanceId", &Bag::getSlotInstanceId);
201 bag.addFunc("getSlotDurability", &Bag::getSlotDurability);
202 bag.addFunc("setSlotDurability", &Bag::setSlotDurability);
203 bag.addFunc("getSlotProp", &Bag::getSlotProp);
204 bag.addFunc("setSlotProp", &Bag::setSlotProp);
205 bag.addFunc("slotHasTag", &Bag::slotHasTag);
206 bag.addFunc("addSlotTag", &Bag::addSlotTag);
207
208 auto eq = table.addClass<EquipmentSet>(
209 "EquipmentSet", std::function<EquipmentSet *()>([]() { return new EquipmentSet(); }), true);
210 eq.addFunc("destroy", &EquipmentSet::destroy);
211 eq.addFunc("getId", &EquipmentSet::getId);
212 eq.addFunc("setId", &EquipmentSet::setId);
213 eq.addFunc("defineSlot", &EquipmentSet::defineSlot);
214 eq.addFunc("clearSlotAllowedTags", &EquipmentSet::clearSlotAllowedTags);
215 eq.addFunc("addSlotAllowedTag", &EquipmentSet::addSlotAllowedTag);
216 eq.addFunc("hasSlot", &EquipmentSet::hasSlot);
217 eq.addFunc("getSlotCount", &EquipmentSet::getSlotCount);
218 eq.addFunc("getSlotName", &EquipmentSet::getSlotName);
219 eq.addFunc("isSlotEmpty", &EquipmentSet::isSlotEmpty);
220 eq.addFunc("getSlotItemId", &EquipmentSet::getSlotItemId);
221 eq.addFunc("getSlotQuantity", &EquipmentSet::getSlotQuantity);
222 eq.addFunc("getSlotInstanceId", &EquipmentSet::getSlotInstanceId);
223 eq.addFunc("equipFromBag", &EquipmentSet::equipFromBag);
224 eq.addFunc("unequipToBag", &EquipmentSet::unequipToBag);
225 eq.addFunc("clearSlot", &EquipmentSet::clearSlot);
226}
227
228void Inventory::expose(ssq::Class &cls) {
229 cls.addFunc("getName", &Inventory::getName);
230 cls.addFunc("registerItemsFromJson", &Inventory::registerItemsFromJson);
231 cls.addFunc("clearItemDefinitions", &Inventory::clearItemDefinitions);
232 cls.addFunc("getItemDefinitionCount", &Inventory::getItemDefinitionCount);
233 cls.addFunc("hasItemDefinition", &Inventory::hasItemDefinition);
234 cls.addFunc("getItemDisplayName", &Inventory::getItemDisplayName);
235 cls.addFunc("getItemMaxStack", &Inventory::getItemMaxStack);
236 cls.addFunc("getItemWeight", &Inventory::getItemWeight);
237 cls.addFunc("getItemVolume", &Inventory::getItemVolume);
238 cls.addFunc("getItemCategory", &Inventory::getItemCategory);
239 cls.addFunc("getItemEquipSlot", &Inventory::getItemEquipSlot);
240 cls.addFunc("itemHasTag", &Inventory::itemHasTag);
241 cls.addFunc("getItemExtra", &Inventory::getItemExtra);
242 cls.addFunc("newBag", &Inventory::newBag);
243 cls.addFunc("newEquipmentSet", &Inventory::newEquipmentSet);
244 cls.addFunc("transferItem", &Inventory::transferItem);
245 cls.addFunc("transferSlot", &Inventory::transferSlot);
246 cls.addFunc("hasAcceptRule", &Inventory::hasAcceptRule);
247 cls.addFunc("hasCapacityPolicy", &Inventory::hasCapacityPolicy);
248 cls.addFunc("hasStackRule", &Inventory::hasStackRule);
249 cls.addFunc("clearChangeEvents", &Inventory::clearChangeEvents);
250 cls.addFunc("getChangeEventCount", &Inventory::getChangeEventCount);
251 cls.addFunc("getChangeEventAction", &Inventory::getChangeEventAction);
252 cls.addFunc("getChangeEventBagId", &Inventory::getChangeEventBagId);
253 cls.addFunc("getChangeEventOtherBagId", &Inventory::getChangeEventOtherBagId);
254 cls.addFunc("getChangeEventItemId", &Inventory::getChangeEventItemId);
255 cls.addFunc("getChangeEventQuantity", &Inventory::getChangeEventQuantity);
256 cls.addFunc("getChangeEventSlot", &Inventory::getChangeEventSlot);
257 cls.addFunc("getChangeEventOtherSlot", &Inventory::getChangeEventOtherSlot);
258 cls.addFunc("getChangeEventEquipSlot", &Inventory::getChangeEventEquipSlot);
259}
260
261} // namespace eve::inventory
HSQOBJECT cls
Definition ECS.cpp:21
#define Module_IMPL(ModuleName, newExpr)
Definition Module.h:24
const char * name
Definition RockMesh.cpp:21
virtual std::string getName() const =0
格子型物品容器(脚本可直接操作)。
Definition Bag.h:17
int getSlotInstanceId(int slot) const
Definition Bag.cpp:122
std::string getId() const
容器 id(变更事件定位用)。
Definition Bag.h:30
float getUsedWeight() const
Definition Bag.cpp:99
void setSlotCount(int slotCount)
调整格数:扩容追加空槽;缩容会丢弃被裁掉的槽(不自动转移)。
Definition Bag.cpp:15
float getMaxVolume() const
Definition Bag.h:45
std::string canAddItemReason(const std::string &itemId, int quantity)
Definition Bag.cpp:61
std::string getAcceptTag(int index) const
Definition Bag.cpp:30
bool canAddItem(const std::string &itemId, int quantity)
便捷操作(转发 InventorySystem):增删 / 移动 / 查询。
Definition Bag.cpp:57
void setSlotDurability(int slot, float durability)
Definition Bag.cpp:132
std::string getSlotProp(int slot, const std::string &key, const std::string &fallback={}) const
Definition Bag.cpp:137
int addItem(const std::string &itemId, int quantity)
Definition Bag.cpp:67
int getRejectTagCount() const
Definition Bag.cpp:43
void addSlotTag(int slot, const std::string &tag)
Definition Bag.cpp:152
bool slotHasTag(int slot, const std::string &tag) const
Definition Bag.cpp:147
float getMaxWeight() const
重量 / 体积上限(容量策略用)。
Definition Bag.h:43
bool splitStack(int slot, int quantity, int toSlot)
Definition Bag.cpp:83
int removeItem(const std::string &itemId, int quantity)
Definition Bag.cpp:71
std::string getStackRule() const
Definition Bag.h:53
void clearRejectTags()
Definition Bag.cpp:35
void setCapacityPolicy(const std::string &name)
Definition Bag.h:52
int findItem(const std::string &itemId) const
Definition Bag.cpp:91
void addRejectTag(const std::string &tag)
Definition Bag.cpp:37
void setKind(const std::string &kind)
Definition Bag.h:35
std::string getKind() const
容器种类(bag / chest / shop 等)。
Definition Bag.h:34
void setAcceptRule(const std::string &name)
Definition Bag.h:50
std::string getSlotItemId(int slot) const
Definition Bag.cpp:112
void setId(const std::string &id)
Definition Bag.h:31
bool moveSlot(int fromSlot, int toSlot)
Definition Bag.cpp:79
int getSlotCount() const
格数。
Definition Bag.h:38
int countItem(const std::string &itemId) const
Definition Bag.cpp:87
float getUsedVolume() const
Definition Bag.cpp:101
int getAcceptTagCount() const
Definition Bag.cpp:28
bool swapSlots(int slotA, int slotB)
Definition Bag.cpp:77
std::string getExtra(const std::string &key, const std::string &fallback={}) const
Definition Bag.cpp:52
std::string getAcceptRule() const
接受规则 / 容量策略 / 堆叠规则名。
Definition Bag.h:49
int getSlotQuantity(int slot) const
Definition Bag.cpp:117
void setExtra(const std::string &key, const std::string &value)
容器级额外属性(键值)。
Definition Bag.cpp:50
int removeAt(int slot, int quantity)
Definition Bag.cpp:75
void setMaxVolume(float v)
Definition Bag.h:46
bool isSlotEmpty(int slot) const
Definition Bag.cpp:107
float getSlotDurability(int slot) const
Definition Bag.cpp:127
void setSlotProp(int slot, const std::string &key, const std::string &value)
Definition Bag.cpp:142
void setMaxWeight(float w)
Definition Bag.h:44
void clearAcceptTags()
可接受 / 拒绝的标签过滤。
Definition Bag.cpp:20
int findItemByTag(const std::string &tag) const
Definition Bag.cpp:95
std::string getCapacityPolicy() const
Definition Bag.h:51
void addAcceptTag(const std::string &tag)
Definition Bag.cpp:22
int getUsedSlotCount() const
Definition Bag.cpp:103
void destroy()
释放资源并使其失效。
Definition Bag.cpp:13
std::string getRejectTag(int index) const
Definition Bag.cpp:45
void setStackRule(const std::string &name)
Definition Bag.h:54
void clearSlotAllowedTags(const std::string &slotName)
Definition Equipment.cpp:20
void setId(const std::string &id)
Definition Equipment.h:26
bool hasSlot(const std::string &slotName) const
Definition Equipment.cpp:33
int getSlotInstanceId(const std::string &slotName) const
Definition Equipment.cpp:62
void addSlotAllowedTag(const std::string &slotName, const std::string &tag)
Definition Equipment.cpp:26
void defineSlot(const std::string &slotName)
声明一个装备槽;已存在则保留当前物品,仅更新允许标签。
Definition Equipment.cpp:12
std::string getSlotName(int index) const
Definition Equipment.cpp:39
bool clearSlot(const std::string &slotName)
直接清空槽位(物品丢弃,不回背包)。
bool equipFromBag(const std::string &equipSlot, Bag *bag, int bagSlot)
bool isSlotEmpty(const std::string &slotName) const
Definition Equipment.cpp:44
std::string getSlotItemId(const std::string &slotName) const
Definition Equipment.cpp:50
int getSlotQuantity(const std::string &slotName) const
Definition Equipment.cpp:56
std::string getId() const
Definition Equipment.h:25
bool unequipToBag(const std::string &equipSlot, Bag *bag)
static void ensureBuiltins()
确保内置规则已注册(模块首次使用时自动调用)。
static const std::vector< InventoryChangeEvent > & events()
static bool hasStackRule(const std::string &name)
static int transfer(Bag *from, Bag *to, const std::string &itemId, int quantity)
static bool hasAcceptRule(const std::string &name)
static bool hasCapacityPolicy(const std::string &name)
static int transferSlot(Bag *from, int fromSlot, Bag *to, int quantity)
背包模块(eve.Inventory)。
Definition Inventory.h:17
bool hasItemDefinition(const std::string &itemId)
物品定义查询(显示名/堆叠/重量/体积/类别/装备槽/标签/额外属性)。
Definition Inventory.cpp:20
std::string getItemExtra(const std::string &itemId, const std::string &key, const std::string &fallback={})
Definition Inventory.cpp:59
int transferItem(Bag *from, Bag *to, const std::string &itemId, int quantity)
跨容器转移(按物品 id / 按槽位);返回实际转移数量。
Definition Inventory.cpp:75
std::string getChangeEventOtherBagId(int index) const
std::string getChangeEventItemId(int index) const
int getChangeEventOtherSlot(int index) const
EquipmentSet * newEquipmentSet()
Definition Inventory.cpp:70
int getItemDefinitionCount()
已注册物品定义数量。
Definition Inventory.cpp:18
bool hasStackRule(const std::string &name)
Definition Inventory.cpp:91
std::string getChangeEventAction(int index) const
std::string getItemCategory(const std::string &itemId)
Definition Inventory.cpp:44
int getChangeEventSlot(int index) const
void clearChangeEvents()
变更事件队列(添加/移除/移动/装备)。
Definition Inventory.cpp:95
int transferSlot(Bag *from, int fromSlot, Bag *to, int quantity)
Definition Inventory.cpp:79
void clearItemDefinitions()
清空物品定义。
Definition Inventory.cpp:16
int registerItemsFromJson(const std::string &json)
从 JSON 注册物品定义;返回成功注册数量。
Definition Inventory.cpp:11
Bag * newBag(int slotCount)
工厂:创建容器 / 装备栏。
Definition Inventory.cpp:65
std::string getChangeEventBagId(int index) const
int getChangeEventCount() const
Definition Inventory.cpp:97
int getChangeEventQuantity(int index) const
bool itemHasTag(const std::string &itemId, const std::string &tag)
Definition Inventory.cpp:54
std::string getItemDisplayName(const std::string &itemId)
Definition Inventory.cpp:24
int getItemMaxStack(const std::string &itemId)
Definition Inventory.cpp:29
bool hasAcceptRule(const std::string &name)
扩展策略是否存在(接受规则 / 容量策略 / 堆叠规则)。
Definition Inventory.cpp:83
float getItemVolume(const std::string &itemId)
Definition Inventory.cpp:39
std::string getItemEquipSlot(const std::string &itemId)
Definition Inventory.cpp:49
bool hasCapacityPolicy(const std::string &name)
Definition Inventory.cpp:87
std::string getChangeEventEquipSlot(int index) const
float getItemWeight(const std::string &itemId)
Definition Inventory.cpp:34
static int loadFromJson(const std::string &json, std::string *error=nullptr)
从 JSON 数组或单对象批量注册,返回成功数量。 元素形如: { "id": "potion.hp", "displayName": "治疗药水", "maxStack": 20,...
Definition Item.cpp:84
static const ItemDefinition * find(const std::string &id)
Definition Item.cpp:53
运行时容器:固定格数的背包 / 箱子 / 商店栏等。 行为由 InventorySystem 提供;本类暴露便于脚本绑定的薄封装方法。
Definition Bag.cpp:6