Files
wsmud/os/item.js
2026-05-26 16:41:20 +08:00

250 lines
7.0 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
require("./util/util");
ITEM = function () {
}
ITEM.inherits(BASE);
ITEM.prototype.heart_beat = function (dt) {
}
ITEM.prototype.init = function () {
}
//物件对命令的反应有几种方式实现
//1. 直接实现ON_XXXXcmd里定义的有直接对象的命令推荐这种比如on_accept是当别人给你东西时候on_checkskill当别人学你技能时适合目标明确的操作
//2. add_action方式房间里的指令推荐用这种虽然也可以实现1但是因为调用add_action时候还没ID适合房间的自定义命令和已定义的有目标的命令
//3. on(xxx)方式,对房间里的命令的反映,适合回应目标不是当前对象,或没有目标的命令
//actions里定义的动作会作为对象的可用操作发送出去
//添加物件可以接收的命令,目标是当前对象的
ITEM.prototype.add_action = function (cmd, name, func) {
if (!cmd) return;
if (!this.actions) this.actions = {};
var act = this.actions[cmd];
if (act) {
if (!name) {
act.action = func;
} else {
act.name = name;
}
if (!func) {
act.name = name;
} else {
act.action = func;
}
} else {
act = {
name: name,
action: func
};
this.actions[cmd] = act;
}
this.json = null;
return act;
}
//移除物件可以接收的命令
ITEM.prototype.remove_action = function (name, func) {
if (!this.actions) this.actions = {};
if (typeof (name) === "string") {
delete this.actions[name];
} else {
for (var i = 0; i < name.length; i++) {
delete this.actions[name[i]];
}
}
this.json = null;
}
//执行命令 返回true表示已经完成命令后续不需要执行
ITEM.prototype.exec = function (cmdName, pars) {
if (this.actions) {
var cmd = this.actions[cmdName];
if (cmd && cmd.action) {
return cmd.action.apply(this, pars);
}
}
return false;
}
ITEM.prototype.max_item_count = 10;
ITEM.prototype.item_count = function () {
return this.items ? this.items.length : 0;
}
ITEM.prototype.is_full = function (val) {
if (!this.items) return false;
if (val) return this.items.length + val > this.max_item_count;
return this.items.length >= this.max_item_count;
}
ITEM.prototype.find_obj = function (id) {
return null;
}
ITEM.prototype.find_obj_bypath = function (path, parent) {
parent = parent || this;
if (!parent.items) return;
for (var i = 0; i < parent.items.length; i++) {
if (parent.items[i].path === path) {
return parent.items[i];
}
}
}
ITEM.prototype.each_item = function (func, parent) {
if (!func) return;
parent = parent || this;
var l = parent.items.length;
for (var i = 0; i < l; i++) {
var item = parent.items[i];
if (!item) continue;
if (func(item) === false) return;
}
};
ITEM.prototype.is = function (obj) {
if (!obj) return false;
if (typeof obj === "string")
return this.path === obj;
return this.path === obj.path;
}
ITEM.prototype.remove_item_byid = function (obj, count = 0) {
if (!obj || !this.items) return;
for (var i = 0; i < this.items.length; i++) {
var item = this.items[i];
if (item.id === obj) {
if (item.combined && count > 0) {
var subitem = item.uncombine(count);
if (!subitem) return;
if (subitem === item) {
this.items.splice(i, 1);
}
return subitem;
} else {
this.items.splice(i, 1);
return item;
}
}
}
return null;
}
ITEM.prototype.remove_item = function (obj, count) {
if (!obj || !this.items) return;
for (var i = 0; i < this.items.length; i++) {
var item = this.items[i];
if (item === obj) {
if (item.combined) {
var subitem = item.uncombine(count);
if (!subitem) return;
if (subitem === item) {
this.items.splice(i, 1);
}
return subitem;
} else {
this.items.splice(i, 1);
return item;
}
}
}
return null;
}
ITEM.prototype.move_item_to = function (obj, count, target) {
if (!obj || !this.items) return;
var moved_obj = this.remove_item(obj, count);
if (!target) return;
return target.push_item(moved_obj);
}
ITEM.prototype.push_item = function (moved_obj) {
if (!moved_obj) return;
if (!this.items) this.items = [];
if (moved_obj.is_money && this.money !== undefined) {
this.money += moved_obj.value * moved_obj.count;
} else if (moved_obj.combined) {
for (var i = 0; i < this.items.length; i++) {
if (this.items[i].is(moved_obj)) {
this.items[i].combine(moved_obj);
return this.items[i];
}
}
this.items.push(moved_obj);
} else {
this.items.push(moved_obj);
}
return moved_obj;
}
ITEM.prototype.create_id = function () {
this.id = UTIL.create_id();
}
ITEM.prototype.refresh = function () {
this.json = null;
}
ITEM.prototype.is_hidden = function () {
return false;
}
ITEM.prototype.query_create_time = function () {
var id = this.id;
if (!id) return;
var time = parseInt(id.substr(4), 16);
return new Date(time * 1000 + UTIL.begin);
}
ITEM.prototype.find_obj_byid = function (items, oid) {
if (!items) return;
for (var i = 0; i < items.length; i++) {
if (items[i].id === oid) {
return items[i];
}
}
}
ITEM.prototype.long_name = function () {
return this.name;
}
ITEM.prototype.create = function (file, ctor) {
this.uid = this.create_uid();
}
ITEM.prototype.destroy = function () {
}
ITEM.prototype.format_temp = function (temp, timeout = 120000) {
if (!temp) return "{}";
var dt = Date.now() + timeout;
var tmp = ["{"];
for (var key in temp) {
var v = temp[key];
if (!v) continue;
if (v.e) {
if (dt > v.e || !v.v) continue;
if (tmp.length > 1) tmp.push(",");
tmp.push("\"");
tmp.push(key);
tmp.push("\":{e:");
tmp.push(v.e);
tmp.push(",v:");
if (typeof v.v == "string") {
tmp.push("\"");
tmp.push(v.v);
tmp.push("\"");
} else {
tmp.push(v.v);
}
tmp.push("}");
} else {
if (tmp.length > 1) tmp.push(",");
tmp.push("\"");
tmp.push(key);
tmp.push("\":");
if (typeof v == "string") {
tmp.push("\"");
tmp.push(v);
tmp.push("\"");
} else {
tmp.push(v);
}
}
}
tmp.push("}");
return tmp.join("");
}