// ==UserScript== // @name iYdxx // @version 0.1.4 // @description Min version, not pro. For YunDingXX, text MUD // @match http://joucks.cn:3344/ // @match http://yundingxx.com:3344/ // @grant unsafeWindow // @require https://cdn.jsdelivr.net/npm/vue@2.6.11/dist/vue.min.js // @require https://unpkg.com/element-ui@2.13.0/lib/index.js // @namespace http://tampermonkey.net/ // @author gIrl1990 // @supportURL https://github.com/gMan1990/userscripts/issues // ==/UserScript== /* Element (min) https://unpkg.com/element-ui@2.13.0/lib/theme-chalk/index.css https://unpkg.com/element-ui@2.13.0/lib/index.js */ jQuery(function($) { document.getElementById("user-task").previousElementSibling.onclick = getUserTaskFunc; document.body.onselectstart = null; document.body.style.overflowY = "overlay"; $(document.head).append('<link rel="stylesheet" href="https://unpkg.com/element-ui@2.13.0/lib/theme-chalk/index.css">'); let notify = function(message, type, duration, dangerouslyUseHTMLString) { Vue.prototype.$notify({ message , type , duration , dangerouslyUseHTMLString , position : "bottom-right" }); }, $options = $("#sellGoodsType>option"); if (!$options.length) { return notify("插件注入失败: #sellGoodsType", "error", 0); } let sellGoodsT2, /* Key-goods2 Map-order Val-goods2 */ sellGoodsType = new Map([ [ $options[0].value, { t : $.text($options[0]), i : 0 } ], [ "2", sellGoodsT2 = { t : "-", i : 1 } ], [ "5db663ba4682c5567589308c", { t : "_鉴-武器", i : 2, p : sellGoodsT2 } ], [ "5db663be0d0236567c02b9b2", { t : "_鉴-防具", i : 3, p : sellGoodsT2 } ] ]); for (let i = 1; i < $options.length; i++) { let v = sellGoodsType.get($options[i].value); v ? (v.t = $.text($options[i])) : sellGoodsType.set($options[i].value, { t : $.text($options[i]), i : sellGoodsType.size }); } /* 礼包-5df6e062a477cd1f36784c46 */ for (let v of [ "5e104150b0a1a420d1b56f6c", "5dfe09520162325366178d48", "5db663ad4682c5567589308a", "5df30563f551bc6dc6cdfc7b" ]) { sellGoodsType.has(v) || sellGoodsType.set(v, { t : v, i : sellGoodsType.size }); } let tableColumnExpand = '<template v-if="c.row.user_equipment">\ <hr style="clear: both">\ <el-col :span="3">评分</el-col><el-col :span="3">{{c.row.user_equipment.score}}</el-col>\ <el-col :span="3">强化等级</el-col><el-col :span="3">{{c.row.user_equipment.level}} +{{c.row.user_equipment.quality}}%</el-col>\ <hr style="clear: both">\ <el-col :span="3">物理伤害</el-col><el-col :span="3">+{{c.row.user_equipment.physical_damage}}</el-col>\ <el-col :span="3">魔法伤害</el-col><el-col :span="3">+{{c.row.user_equipment.magic_damage}}</el-col>\ <el-col :span="3">物理防御</el-col><el-col :span="3">+{{c.row.user_equipment.physical_defense}}</el-col>\ <el-col :span="3">魔法防御</el-col><el-col :span="3">+{{c.row.user_equipment.magic_defense}}</el-col>\ <el-col :span="3">治疗能力</el-col><el-col :span="3">+{{c.row.user_equipment.restore_damage}}</el-col>\ <el-col :span="3">气血上限</el-col><el-col :span="3">+{{c.row.user_equipment.ph_num}}</el-col>\ <el-col :span="3">速度</el-col><el-col :span="3">+{{c.row.user_equipment.speed}}</el-col>\ <el-col :span="3">暴击</el-col><el-col :span="3">+{{c.row.user_equipment.crit}}</el-col>\ <hr style="clear: both">\ <el-col :span="2">武力</el-col><el-col :span="2">+{{c.row.user_equipment.force_num}}</el-col>\ <el-col :span="2">智力</el-col><el-col :span="2">+{{c.row.user_equipment.iq_num}}</el-col>\ <el-col :span="2">信仰</el-col><el-col :span="2">+{{c.row.user_equipment.faith_num}}</el-col>\ <el-col :span="2">耐力</el-col><el-col :span="2">+{{c.row.user_equipment.endurance_num}}</el-col>\ <el-col :span="2">敏捷</el-col><el-col :span="2">+{{c.row.user_equipment.agile_num}}</el-col>\ </template>'; $("#myTab").append('<li><a href="#goods2">^背包</a></li>') .next().append(`<div id="goods2" class="tab-pane"> <el-container v-loading="!userGoodsErr"> <el-header style="padding-top: 15px"> <el-button size="small" @click="$refs.t.clearSelection();getUserGoods()">刷新</el-button> <span class="text-danger">{{userGoodsErr}}</span> <span v-if="$refs.t" style="float: right"> 数量 <el-input-number v-model="commGoodsNum" step-strictly size="mini" :min="1"></el-input-number> <el-button :disabled="!commGoodsNum||2>$refs.t.store.states.selection.length" size="mini" type="text" @click="makeGoods">合成</el-button> <el-button :disabled="!commGoodsNum||1!=$refs.t.store.states.selection.length" size="mini" type="text" @click="useGoodsToUser">使用</el-button> <br> <el-button :disabled="!commGoodsNum" size="mini" type="text" @click="byGoodsToMyUser('5df6ee69f6ffda1f2ccc4739')">买500活</el-button> <el-button :disabled="!commGoodsNum" size="mini" type="text" @click="byGoodsToMyUser('5dbd161e928be213f1c3accc')">买宝宝窝</el-button> <el-button :disabled="!commGoodsNum" size="mini" type="text" @click="byGoodsToMyUser('5dbfcc8cd9b8c0272471e2bf')">买红药水</el-button> </span> </el-header> <el-main> <el-table ref="t" :data="userGoodsList" row-key="_id" size="mini" :default-sort="{prop:'_type',order:'ascending'}" style="font-family: monospace;width: 80%;display: inline-grid"> <el-table-column type="selection" reserve-selection></el-table-column> <el-table-column type="expand"> <template slot-scope="c"> <el-col :span="4">created_at</el-col><el-col :span="9">{{c.row.created_at}}</el-col> ${tableColumnExpand} </template> </el-table-column> <el-table-column width="180"> <template slot-scope="h" slot="header"><el-input v-model="userGoodsSearch" clearable size="mini" placeholder="正则搜索" @input="userGoodsSearchInput"></el-input></template> <template slot-scope="c"> <el-popover :content="c.row.goods.info"><span slot="reference" :style="c.row.goods.style">{{c.row.goods.name}}</span></el-popover> <span v-if="c.row.user_equipment" style="float: right">{{c.row.user_equipment.wear_level}}{{eq_type[c.row.user_equipment.type]}}</span> <span v-else style="float: right">{{c.row.price}}{{price_type[c.row.price_type]}}</span> </template> </el-table-column> <el-table-column prop="_page" label="页码" align="right"></el-table-column> <el-table-column prop="_type" sortable :sort-orders="['ascending']" :formatter="userGoodsTypeFmt" label="分类" show-overflow-tooltip></el-table-column> <el-table-column prop="count" sortable :sort-orders="['ascending']" label="数量" align="right"></el-table-column> <el-table-column label="操作" width="90"> <template slot-scope="c"> <template v-if="c.row.user_equipment"> <span class="text-muted">可售</span> <el-button :disabled="!c.row.count" size="mini" type="text" @click="wearUserEquipment(c.row)">佩戴</el-button> </template> <template v-else> <span class="text-muted">{{c.row.goods.is_sell?"可售":"禁售"}}</span> <el-button v-if="c.row.goods.use_goods" :disabled="!c.row.count" size="mini" type="text" @click="useGoodsToUser(c.row)">使用</el-button> </template> </template> </el-table-column> </el-table> <ul v-if="$refs.t" style="font-family: monospace;width: 20%;float: right"> 已选 <el-button size="mini" type="text" @click="$refs.t.clearSelection">清空</el-button> {{$refs.t.store.states.selection.length}} <li v-for="v in $refs.t.store.states.selection" :key="v._id"> <div>{{v.goods.name}}</div> <div style="text-align: right">{{v.count}}</div> </li> </ul> </el-main> </el-container> </div>`); let $log = $("#log"), eq_type = { "1" : "武", "2" : "甲", "3" : "头", "4" : "饰", /* 链 */ "5" : "腰", "6" : "靴" }; $._ydxx = { goods2 : new Vue({ el : "#goods2", data : { eq_type , price_type : { "0" : "竹", "1" : "银", "2" : "金" }, userGoodsSearch : "", userGoodsErr : " ", /* see loading */ userGoodsList : [], commGoodsNum : 1 }, methods : { userGoodsSearchInput : function(s) { this._userGoodsList && (this.userGoodsList = s ? this._userGoodsList.filter(function(d) { return this.test(d.goods.name); }, new RegExp(s)) : this._userGoodsList); }, userGoodsTypeFmt : function(row) { if (row.user_equipment) { return sellGoodsT2.t; } let v = sellGoodsType.get(row.goods.goods_type); return v ? v.t : row.goods.goods_type; }, /** * # 未知分类 * ## 分类编码 升序 * ### 名称 升序 * # 已知分类 * ## 分类序号 升序 * ### 装备 * #### 等级 升序 * ### 其它 * #### 名称 升序 */ userGoodsTypeSort : function(ra, rb) { if (ra.user_equipment) { if (rb.user_equipment) { return ra.user_equipment.wear_level - rb.user_equipment.wear_level; } else { return this._userGoodsTypeSort(ra, rb, sellGoodsT2, sellGoodsType.get(rb.goods.goods_type)); } } else { if (rb.user_equipment) { return this._userGoodsTypeSort(ra, rb, sellGoodsType.get(ra.goods.goods_type), sellGoodsT2); } else { return this._userGoodsTypeSort(ra, rb, sellGoodsType.get(ra.goods.goods_type), sellGoodsType.get(rb.goods.goods_type)); } } }, _userGoodsTypeSort : function(ra, rb, va, vb) { if (va) { if (vb) { if (va.i != vb.i) { return va.i - vb.i; } } else { return 1; } } else { if (vb) { return -1; } else { if (ra.goods.goods_type != rb.goods.goods_type) { return ra.goods.goods_type < rb.goods.goods_type ? -1 : 1; } } } return ra.goods.name == rb.goods.name ? 0 : (ra.goods.name < rb.goods.name ? -1 : 1); }, getUserGoods : function() { this.userGoodsErr = ""; /* lock */ this._userGoodsList = []; /* new array, !=ugl */ this._getUserGoods(1); }, _getUserGoods : function(page) { let vm = this; $.ajax({ data : { page }, url : "/api/getUserGoods", success : function(d, t, x) { if (200 == d.code) { for (let v of d.data) { if (!v.goods) { if (!v.user_equipment) { v.user_equipment = {}; } else if (v.user_equipment.status) { continue; } v.goods = v.user_equipment; } v._page = page; vm._userGoodsList.push(v); } if (page < d.pages) { vm._getUserGoods(++page); } else { vm._userGoodsList.sort(vm.userGoodsTypeSort); vm.userGoodsSearchInput(vm.userGoodsSearch); vm.userGoodsErr = " "; } } else { this.error(x, d.msg); } }, error : function(x, t, e) { vm.userGoodsList = vm._userGoodsList = []; vm.userGoodsErr = e || t; } }); }, /** @param r row or event. */ useGoodsToUser : function(r) { this.userGoodsErr = ""; /* lock */ r._id ? this._useGoodsToUser(r, 1) : this._useGoodsToUser(this.$refs.t.store.states.selection[0], this.commGoodsNum); }, /** @param lastIndex 1 or commGoodsNum. */ _useGoodsToUser : function(r, lastIndex) { let vm = this; $.ajax({ data : { ugid : r._id }, type : "POST", url : "/api/useGoodsToUser", success : function(d, t, x) { if (200 == d.code) { r.count--; $log.prepend(`<p class="loginfo" style="color: coral;word-break: break-all">使用 [<span style="${r.goods.style}">${r.goods.name}</span>] ${JSON.stringify(d.data)}</p>`); notify(JSON.stringify(d), "success", 4500, true); if (1 < lastIndex) { setTimeout(vm._useGoodsToUser, 350, r, --lastIndex); } else { vm.userGoodsErr = " "; } } else { this.error(x, d.msg); } }, error : function(x, t, e) { notify(`useGoodsToUser: ${e || t}`, "error", 9000); vm.userGoodsErr = " "; } }); }, makeGoods : function() { this.userGoodsErr = ""; /* lock */ let vm = this; $.ajax({ data : { sell_json : JSON.stringify(vm.$refs.t.store.states.selection.map(v => ({ id : v._id, count : vm.commGoodsNum }))), sell_type : "make" }, type : "POST", url : "/api/makeGoods", success : function(d, t, x) { if (200 == d.code) { for (let v of vm.$refs.t.store.states.selection) { v.count -= vm.commGoodsNum; } $log.prepend(`<p class="loginfo">合成 [<span style="${d.data.goods.style}">${d.data.goods.name}</span>] *${d.data.count}</p>`); notify(JSON.stringify(d), "success"); vm.userGoodsErr = " "; } else { this.error(x, d.msg); } }, error : function(x, t, e) { notify(`makeGoods: ${e || t}`, "error", 9000); vm.userGoodsErr = " "; } }); }, wearUserEquipment : function(r) { this.userGoodsErr = ""; /* lock */ let vm = this; $.ajax({ data : { ueid : r.user_equipment._id, status : 0 }, type : "POST", url : "/api/wearUserEquipment", success : function(d, t, x) { if (200 == d.code) { r.count--; $log.prepend(`<p>佩戴 [<span style="${d.data.style}">${d.data.name}</span>]</p>`); notify(JSON.stringify(d), "success"); vm.userGoodsErr = " "; } else { this.error(x, d.msg); } }, error : function(x, t, e) { notify(`wearUserEquipment: ${e || t}`, "error", 9000); vm.userGoodsErr = " "; } }); }, byGoodsToMyUser : function(gid) { this.userGoodsErr = ""; /* lock */ this._byGoodsToMyUser(gid, this.commGoodsNum); }, _byGoodsToMyUser : function(gid, lastIndex) { let vm = this; $.ajax({ data : { gid }, type : "POST", url : "/api/byGoodsToMyUser", success : function(d, t, x) { if (200 == d.code) { $log.prepend(`<p class="loginfo">购得 [<span style="${d.data.style}">${d.data.name}</span>] *1 单价=${d.data.price}${vm.price_type[d.data.price_type]}</p>`); notify(JSON.stringify(d), "success"); if (1 < lastIndex) { setTimeout(vm._byGoodsToMyUser, 350, gid, --lastIndex); } else { vm.userGoodsErr = " "; } } else { this.error(x, d.msg); } }, error : function(x, t, e) { notify(`byGoodsToMyUser: ${e || t}`, "error", 9000); vm.userGoodsErr = " "; } }); } } }) }; });