import SKUIUtil from "../../ts/gear_2.3.4/util/SKUIUtil"; import SKDataUtil from "../../ts/gear_2.3.4/util/SKDataUtil"; import GameModel from "../../ts/core/GameModel"; import HorseUtil from "../../ts/horse/HorseUtil"; import HorseList from "../../ts/horse/HorseList"; import LiveEntity from "../../ts/core/LiveEntity"; import WingUtil from "../../ts/wing/WingUtil"; import MyModel from "../../ts/core/MyModel"; import GameUtil from "../../ts/core/GameUtil"; import SKLogger from "../../ts/gear_2.3.4/util/SKLogger"; import VIPUtil from "../../ts/game/role/VIPUtil"; import { mainUI } from "../WorldRewardMgr"; import WeaponUtil from "../../ts/weapon/WeaponUtil"; let GameRes = require('../GameRes'); let CPubFunction = require('../PubFunction'); let roleTitleUtil = require('../../utils/RoleTitlesUtil'); cc.Class({ extends: LiveEntity, properties: { bodyNode: cc.Node, roleNode: cc.Node, maskNode: cc.Node, zqmaskNode: cc.Node, roleAddonNode: cc.Node, roleAddonBehindNode: cc.Node, roleAddonFrontNode: cc.Node, roleEffNode: cc.Node, shadowNode: cc.Node, RoleshadowNode: cc.Node, weaponNode: cc.Node, anotherWeaponNode: cc.Node, horseNode: cc.Node, btnPlayerAvatar: cc.Prefab, footEffPre: cc.Prefab, addFootEffFunc: null, isOpenFootTimer: false, isShane: false, nameImgTitleNode: cc.Node, nameImgTitleHorseNode: cc.Node, name2Node: cc.Node, name2HorseNode: cc.Node, }, onLoad() { this._super(); this.isMy = false; this.dir = 1; this.isHidden = false; this.teamid = 0; this.obj_type = 0; this.resid = 0; this.tResid = 0; this.run_type = 0; this.netInfo = {}; this.move_speed = 250; this.move_tiems = 0; this.bodyEffid = 0; this.footEffid = 0; this.headBorderid = 0; this.wing_behind_1 = this.bodyNode.getChildByName("wing_behind_1"); this.wing_behind_2 = this.bodyNode.getChildByName("wing_behind_2"); this.wing_front_1 = this.bodyNode.getChildByName("wing_front_1"); this.wing_front_2 = this.bodyNode.getChildByName("wing_front_2"); // this.nameImgTitleNode = this.node.getChildByName('imgTitle'); this.name1Node = this.node.getChildByName('name_1'); // this.name2Node = this.node.getChildByName('name_2'); this.moveAngle = 0; this.weaponname = ''; this.schedule(this.checkPos, 0.1, cc.macro.REPEAT_FOREVER); this.movePath = []; this.isBing = false; if (this.horseList == null) { this.horseList = new HorseList(); this.horseList.horseChange = this.horseChange.bind(this); } this.wingId = 0; this.addFootEffFunc = function () { if (this.footEffid == 0 || this.living_state != 2) return; let fE = CPubFunction.CreateSubNode(cc.find('Canvas/MapUI'), { nX: this.node.x, nY: this.node.y }, this.footEffPre, 'footEff'); fE.getComponent('footEff').init(this.footEffid, this.dir, this.bodyNode.scaleX); } }, // 坐騎改變回調 horseChange() { // console.log("坐騎回調") let horseIndex = this.horseList.horseIndex; if (this.living_state == 0) { if (this.run_type == 0) { let horseResId = this.horseList.resId; if (horseResId == 0) { this.bodyNode.active = true; this.horseNode.active = false; this.loadResThenPlay(`stand_${this.dir}`); if (this.tResid == 0) this.addWeaponAnimationByLR("stand"); else { this.weaponNode.active = false this.anotherWeaponNode.active = false } // CPubFunction.addWeaponAnimation(this.netInfo.weapon, this.weaponNode, this.roleNode, this, this.resid, 'stand', this.dir); if (this.isMy) { // 下馬 GameModel.send('c2s_get_down', { horseIndex: horseIndex, }); } } else { this.bodyNode.active = false; this.horseNode.active = true; // 騎乘 HorseUtil.playAni(this.horseNode, this.resid, this.dir, "stand", horseResId); WingUtil.playAni(this.horseNode, this.resid, this.dir, "stand", horseResId, this.wingId); if (this.isMy) { GameModel.send('c2s_ride', { horseIndex: horseIndex, }); } } } } }, effectChange() { this.roleEffNode.active = false; let clips = this.roleEffNode.getComponent(cc.Animation).getClips(); for (const clip of clips) { this.roleEffNode.getComponent(cc.Animation).stop(clip.name); this.roleEffNode.getComponent(cc.Animation).removeClip(clip, true); } this.playEff(this.bodyEffid) }, changeWing(wingId) { if (this.wingId == wingId) { return; } this.wingId = wingId; if (this.living_state == 0) { if (this.run_type == 0) { let horseResId = this.horseList.resId; if (horseResId == 0) { WingUtil.playAni(this.bodyNode, this.resid, this.dir, "stand", horseResId, this.wingId); } else { HorseUtil.playAni(this.horseNode, this.resid, this.dir, "stand", horseResId); WingUtil.playAni(this.horseNode, this.resid, this.dir, "stand", horseResId, this.wingId); } } } }, clear() { // var weaponNode1 = this.weaponNode; // var animation = weaponNode1.getComponent(cc.Animation); // if (animation) { // animation.stop() // var clips = animation.getClips(); // for (const clip of clips) { // weaponNode1.getComponent(cc.Animation).stop(clip.name); // weaponNode1.getComponent(cc.Animation).removeClip(clip, true); // } // } // var weaponNode2 = this.anotherWeaponNode; // var animation = weaponNode2.getComponent(cc.Animation); // if (animation) { // animation.stop() // var clips = animation.getClips(); // for (const clip of clips) { // weaponNode2.getComponent(cc.Animation).stop(clip.name); // weaponNode2.getComponent(cc.Animation).removeClip(clip, true); // } // } if (this.roleNode) { var animation = this.roleNode.getComponent(cc.Animation); animation.stop() let clips = animation.getClips(); for (const clip of clips) { this.roleNode.getComponent(cc.Animation).stop(clip.name); this.roleNode.getComponent(cc.Animation).removeClip(clip, true); } } if (this.RoleshadowNode) { var animation = this.RoleshadowNode.getComponent(cc.Animation); animation.stop() let clips = animation.getClips(); for (const clip of clips) { this.RoleshadowNode.getComponent(cc.Animation).stop(clip.name); this.RoleshadowNode.getComponent(cc.Animation).removeClip(clip, true); } } if (this.maskNode) { var animation = this.maskNode.getComponent(cc.Animation); let clips = animation.getClips(); for (const clip of clips) { this.maskNode.getComponent(cc.Animation).stop(clip.name); this.maskNode.getComponent(cc.Animation).removeClip(clip, true); } } }, /* * 顏色轉換 */ hxcolorTransfrom(color) { // let num = parseInt(color, 16); let num = color; let r = Math.floor(num / 256 / 256); let g = Math.floor(num / 256 % 256); let b = Math.floor(num % 256); return new cc.Color(r, g, b); }, showColorMask() { let color1 = this.netInfo.color1, color2 = this.netInfo.color2; if (this.netInfo.roleid == GameModel.player.roleid) { color1 = GameModel.player.color1; color2 = GameModel.player.color2; } if (color1 == 0 && color2 == 0) { this.unshowColorMask(); return; } this.showColorMask1(this.hxcolorTransfrom(color1), this.hxcolorTransfrom(color2)) }, unshowColorMask() { // this.maskNode = false; this.maskNode.active = false; this.zqmaskNode.active = false; }, // 設置角色是否隱藏,1.自己永遠不會被隱藏,2.隱藏多餘的自己,3.判斷是不是隊友 resetHidden() { if (this.isMy) { return; } let myRole = GameModel.player; // 有重影 if (this.netInfo.roleid == myRole.roleid) { this.isHidden = true; this.node.active = false; cc.warn(`$警告:玩家重複:${this.netInfo.name}`); return; } let isHidden = GameModel.hideNotTeam; if (isHidden) { // 是否為隊友 if (this.netInfo.teamid != 0 && this.netInfo.teamid == myRole.teamid) { this.node.active = true; } else { this.node.active = false; } } else { this.node.active = true; } }, loadEff(url, loop, x, y, cb) { var self = this self.deleteEffNode() cc.loader.loadRes(url, cc.SpriteAtlas, function (error, atlas) { if (error) { cc.warn(`$警告:加載資源錯誤:${url}`); return; } if (!atlas) return; if (!SKUIUtil.isValid(self.roleNode)) { cc.warn(`$警告:角色播放動畫失敗,角色節點無效`); return; } let curFrames = atlas.getSpriteFrames(); let curClip = cc.AnimationClip.createWithSpriteFrames(curFrames, 10); curClip.name = `eff`; if (loop) curClip.wrapMode = cc.WrapMode.Loop; else curClip.wrapMode = cc.WrapMode.Normal; cc.loader.loadRes("Prefabs/EffectFrame", cc.Prefab, (err, prefab) => { if (err) { console.log(err) return; } if (!SKUIUtil.isValid(self.roleNode)) { cc.warn(`$警告:角色播放動畫失敗,角色節點無效`); return; } let effNode = cc.instantiate(prefab); effNode.name = "AddonEffNode" effNode.x = x effNode.y = y effNode.parent = self.node effNode.getComponent("Effect").CreateAndPlayAnimation(curClip, cb) }) }) }, deleteEffNode() { for (let i = this.node.children.length - 1; i > 0; i--) { if (this.node.children[i].name == "AddonEffNode") this.node.children[i].destroy() } }, resetRoleTitle() { let vipLevel = VIPUtil.getVipLevel(this.netInfo.chargesum || 0); let prefix = vipLevel > 0 ? `` : ``; console.log("________________________", prefix) if (this.name1Node) { this.name1Node.color = GameUtil.getReliveColor(this.netInfo.relive); let title = this.netInfo.name; this.name1Node.getComponent(cc.RichText).string = `${prefix}${title}`; this.name1Node.active = true; if (this.isShane) { this.name1Node.getChildByName("zuolao").x = -this.netInfo.name.length * 40 / 2 - 20; this.name1Node.getChildByName("zuolao").active = true } else { this.name1Node.getChildByName("zuolao").active = false } } var postArr = ["", "幫主", "副幫主", "左護法", "右護法", "長老", "堂主", "幫眾"] this.name2Node.getComponent(cc.Label).string = `${this.netInfo.bangname}${postArr[this.netInfo.bangpost || 0]}` this.name2HorseNode.getComponent(cc.Label).string = `${this.netInfo.bangname}${postArr[this.netInfo.bangpost || 0]}` if (this.netInfo.mapid == 3001) { this.name2Node.active = true this.name2HorseNode.active = true this.nameImgTitleNode.active = false; this.nameImgTitleHorseNode.active = false; if (this.netInfo.bangname == GameModel.player.bangname) { this.name2Node.color = new cc.Color(255, 0, 0) this.name2HorseNode.color = new cc.Color(255, 0, 0) } else { this.name2Node.color = new cc.Color(0, 150, 255) this.name2HorseNode.color = new cc.Color(0, 150, 255) } return } else { this.name2Node.active = false this.name2HorseNode.active = false } // return if (this.netInfo.titleid == 0) { //不顯示稱謂 if (this.nameImgTitleNode) { this.nameImgTitleNode.active = false; this.nameImgTitleHorseNode.active = false; } if (this.name2Node) { this.name2Node.active = false; this.name2HorseNode.active = false; } if (this.name1Node) { this.name1Node.color = GameUtil.getReliveColor(this.netInfo.relive); let title = this.netInfo.name; this.name1Node.getComponent(cc.RichText).string = `${prefix}${title}`; this.name1Node.active = true; } } else if (this.netInfo.titleid <= 112) { //顯示圖片+名字 this.name2Node && (this.name2Node.active = false); this.name2HorseNode && (this.name2HorseNode.active = false); let titleId = this.netInfo.titleid; SKUIUtil.setSpriteFrame(this.nameImgTitleNode, 'Common/role_title', `roletitle_${titleId}`); SKUIUtil.setSpriteFrame(this.nameImgTitleHorseNode, 'Common/role_title', `roletitle_${titleId}`); this.nameImgTitleNode && (this.nameImgTitleNode.active = true); this.nameImgTitleHorseNode && (this.nameImgTitleHorseNode.active = true); if (this.name1Node) { this.name1Node.color = GameUtil.getReliveColor(this.netInfo.relive); let title = this.netInfo.name; let rt = this.name1Node.getComponent(cc.RichText); rt.string = `${prefix}${title}`; this.name1Node.active = true; } } else { //顯示文字稱謂+名字 this.nameImgTitleNode && (this.nameImgTitleNode.active = false); this.nameImgTitleHorseNode && (this.nameImgTitleHorseNode.active = false); let titleShow = roleTitleUtil.getRoleTitle(this.netInfo.titleid, this.netInfo.titleval, this.netInfo.bangname); if (titleShow != null && this.name2Node) { this.name2Node.color = new cc.Color(30, 144, 255); this.name2HorseNode.color = new cc.Color(30, 144, 255); console.log(`+++++++++++++++++++++++++++${titleShow.name}`) let title = `${titleShow.name}`; this.name2Node.getComponent(cc.Label).string = title; this.name2HorseNode.getComponent(cc.Label).string = title; this.name2Node.active = true; this.name2HorseNode.active = true; } if (this.name1Node) { this.name1Node.color = GameUtil.getReliveColor(this.netInfo.relive); let title = this.netInfo.name; this.name1Node.getComponent(cc.RichText).string = `${prefix}${title}`; this.name1Node.active = true; } } }, resetName(name) { let vipLevel = VIPUtil.getVipLevel(this.netInfo.chargesum || 0); let prefix = vipLevel > 0 ? `` : ``; this.netInfo.name = name; this.name1Node.getComponent(cc.RichText).string = `${prefix}${title}`; }, resetResid(resid) { this.tResid = resid; this.weaponNode.active = false this.anotherWeaponNode.active = false this.clear() let temp = GameModel.conf_res_anchor[resid]; if (temp) { let anchorY = temp.anchorY; this.roleNode.anchorY = anchorY; this.maskNode.anchorY = anchorY; this.RoleshadowNode.anchorY = anchorY; } // else { // SKLogger.warn(`找不到資源軸心配置:${this.resid}`); // } if (this.horseList.resId == 0) { this.loadResThenPlay(`stand_${this.dir}`); this.wing_behind_1.active = false this.wing_behind_2.active = false this.wing_front_1.active = false this.wing_front_2.active = false } }, clearChange(resid) { this.tResid = 0; this.weaponNode.active = false this.anotherWeaponNode.active = false this.clear() let temp = GameModel.conf_res_anchor[resid]; if (temp) { let anchorY = temp.anchorY; this.roleNode.anchorY = anchorY; this.maskNode.anchorY = anchorY; this.RoleshadowNode.anchorY = anchorY; } if (this.horseList.resId == 0) { this.loadResThenPlay(`stand_${this.dir}`); this.addWeaponAnimationByLR("stand"); this.wing_behind_1.active = false this.wing_behind_2.active = false this.wing_front_1.active = false this.wing_front_2.active = false } }, setInfo(objInfo, loadGame) { this.netInfo = objInfo; this.loadGame = loadGame; this.isShane = objInfo.shane && objInfo.shane > 0; if (this.netInfo.wingId) { let wingId = SKDataUtil.findByDict(GameModel.game_conf.wing, "resid", this.netInfo.wingId, "id", 0); this.wingId = wingId; } if (this.netInfo.x < 0 || this.netInfo.y < 0) { this.netInfo.x = 0; this.netInfo.y = 0; } this.resAtlas = GameRes.getRoleRes(this.netInfo.resid); this.resid = this.netInfo.resid; this.tResid = this.netInfo.changeid ? this.netInfo.changeid : 0; this.resetRoleTitle(); this.resetHidden(); if (this.roleNode.getComponent(cc.Animation)) { let clips = this.roleNode.getComponent(cc.Animation).getClips(); for (const clip of clips) { this.roleNode.getComponent(cc.Animation).removeClip(clip, true); } } if (this.maskNode.getComponent(cc.Animation)) { let clips = this.maskNode.getComponent(cc.Animation).getClips(); for (const clip of clips) { this.maskNode.getComponent(cc.Animation).removeClip(clip, true); } } if (this.RoleshadowNode.getComponent(cc.Animation)) { let clips = this.RoleshadowNode.getComponent(cc.Animation).getClips(); for (const clip of clips) { this.RoleshadowNode.getComponent(cc.Animation).removeClip(clip, true); } } if (this.isMy) { MyModel.shared.race = this.netInfo.race; MyModel.shared.resId = this.netInfo.resid; } if (this.netInfo.gameData) { this.horseList.parse(this.netInfo.gameData.horseList, this.netInfo.race); } else { this.horseList.parse(this.netInfo.horseList, this.netInfo.race); } if(this.resid == 3005){ this.roleEffNode.position = cc.v3(15, -53, 0); this.roleEffNode.scale = 1.5; }else{ this.roleEffNode.position = cc.v3(0, 0, 0); this.roleEffNode.scale = 1; } let horseResId = this.horseList.resId; if (horseResId == 0) { this.bodyNode.active = true; this.horseNode.active = false; this.loadResThenPlay(`stand_${this.dir}`); if (this.tResid == 0) this.addWeaponAnimationByLR("stand") else { this.weaponNode.active = false this.anotherWeaponNode.active = false } // CPubFunction.addWeaponAnimation(this.netInfo.weapon, this.weaponNode, this.roleNode, this, this.resid, 'stand', this.dir); } else { this.bodyNode.active = false; this.horseNode.active = true; HorseUtil.playAni(this.horseNode, this.resid, this.dir, "stand", horseResId); WingUtil.playAni(this.horseNode, this.resid, this.dir, "stand", horseResId, this.wingId); } let mapConf = GameModel.conf_map; let nID = mapConf[this.netInfo.mapid].mapid; let mapinfo = GameModel.conf_map_list[nID]; this.gridInfoArr = mapinfo.mapInfo; if (mapinfo.baseInfo.rows <= this.netInfo.y || mapinfo.baseInfo.lines <= this.netInfo.x) { this.netInfo.x = mapinfo.startPos.x; this.netInfo.y = mapinfo.startPos.y; } this.setObjPos(this.netInfo.x, this.netInfo.y); var resid = this.tResid ? this.tResid : this.resid let temp = GameModel.conf_res_anchor[resid]; if (temp) { let anchorY = temp.anchorY; let anchorX = temp.anchorX; this.roleNode.anchorY = anchorY; this.roleNode.anchorX = anchorX; this.maskNode.anchorY = anchorY; this.maskNode.anchorX = anchorX; this.RoleshadowNode.anchorY = anchorY; this.RoleshadowNode.anchorX = anchorX; this.roleEffNode.anchorY = anchorY; this.roleEffNode.anchorX = anchorX; this.weaponNode.anchorY = anchorY; this.weaponNode.anchorX = anchorX; } else { SKLogger.warn(`找不到資源軸心配置:${this.resid}`); } if (this.gridInfoArr[this.netInfo.y][this.netInfo.x] == 2) { this.node.opacity = 150; } else { this.node.opacity = 255; } this.showColorMask(); if (objInfo.effectlist) { var list = SKDataUtil.jsonBy(objInfo.effectlist); for (let i in list) { if (list[i] >= 505105 && list[i] <= 505110) this.footEffid = list[i] } } if (objInfo.effectid) this.bodyEffid = objInfo.effectid this.playEff(this.bodyEffid); if (objInfo.isFrozen == 1) { this.forzenRole() } else { this.deleteEffNode() } }, changeHeadBorder(headBorderId) { if (headBorderId && this.isMy) { if (this.headBorderid != headBorderId) { this.headBorderid = headBorderId; var mainUI = cc.find('Canvas/MainUI'); if (mainUI) { var lg = mainUI.getComponent("MainUI"); if (lg) lg.changeHeadBorder(this.headBorderid); } } } }, // 判斷是否為雙武器並添加動畫 addWeaponAnimationByLR(action = "stand") { var show = GameModel.player.roleid != this.netInfo.roleid //CPubFunction.addWeaponAnimation(this.netInfo.weapon, this.weaponNode, this.roleNode, this, this.resid, action, this.dir, show); WeaponUtil.addWeaponAnimation(this.netInfo.weapon, this.weaponNode, this.roleNode, this, this.resid, action, this.dir, 2); }, addHeadStatus(name) { //zhandou:戰鬥 zudui:隊長未滿員 zudui2:隊長滿員 if (this.node.getChildByName(name)) { return; } let url = ""; if (name == 'zhandou') { url = 'battle/zhandou'; } else if (name == 'zudui' || name == 'zudui2') { this.delHeadStatus('zudui'); this.delHeadStatus('zudui2'); url = 'team/' + name; } if (url.length < 1) { return; } let self = this; cc.loader.loadRes(url, cc.SpriteAtlas, function (error, atlas) { if (error) { cc.warn(`$警告:加載角色頭頂狀態資源錯誤${url}`); return; } if (!SKUIUtil.isValid(self.node)) { cc.warn(`$警告:加載角色頭頂狀態角色節點無效!`); return; } let curFrames = atlas.getSpriteFrames(); let curClip = cc.AnimationClip.createWithSpriteFrames(curFrames, 10); curClip.name = name; curClip.wrapMode = cc.WrapMode.Loop; let statusNode = new cc.Node(); statusNode.parent = self.node; let statusAni = statusNode.addComponent(cc.Animation); let statusSp = statusNode.addComponent(cc.Sprite); statusSp.spriteFrame = curFrames[0]; statusSp.trim = false; statusSp.sizeMode = cc.Sprite.SizeMode.RAW; statusNode.name = name; statusAni.addClip(curClip); statusAni.play(name); statusNode.anchorY = 0; statusNode.y = 170; self.scheduleOnce(() => { if (SKUIUtil.isValid(statusNode) && statusNode.width > 0) { statusNode.scaleX = 50 / statusNode.width; statusNode.scaleY = 50 / statusNode.width; } else { cc.warn(`$警告:角色[${self.netInfo.roleid}]頭頂狀態節點異常`); } }, 0); }); }, delHeadStatus(name) { while (this.node.getChildByName(name)) { let node = this.node.getChildByName(name); node.parent = null; node.destroy(); } }, changeWeapon(weapon) { this.netInfo.weapon = weapon; }, loadResThenPlay(name) { let self = this; var resid = 0; if (this.tResid > 0 && this.horseList.resId == 0){ this.wing_behind_1.active = false this.wing_behind_2.active = false this.wing_front_1.active = false this.wing_front_2.active = false this.RoleshadowNode.active = false this.shadowNode.active = true this.maskNode.active = false resid = this.tResid }else{ this.wing_behind_1.active = true this.wing_behind_2.active = true this.wing_front_1.active = true this.wing_front_2.active = true this.RoleshadowNode.active = true this.shadowNode.active = false resid = this.resid } let url = `shap/${resid}/${name}`; let url2 = `shape_mask/${this.resid}/${name}`; let url3 = `shap/${this.resid}/${name}_addon`; let url4 = `ccbtex/shadow/${this.resid}_${name}_sw`; cc.loader.loadRes(url, cc.SpriteAtlas, (error, atlas) => { if (error) { cc.warn(`$警告:加載資源${url}失敗!`); return; } self.playAnimation(name); }); // 未變身就查找其他動畫特效 if (this.tResid == 0) { if (this.resid<=4038){ this.shadowNode.active = false this.RoleshadowNode.active = true cc.loader.loadRes(url4, cc.SpriteAtlas, (error, atlas) => { if (error) { cc.warn(`$警告:加載影子資源${url4}失敗!`); self.RoleshadowNode.active = false return; } self.playRoleshadowAnimation(name); }); }else{ this.shadowNode.active = true this.RoleshadowNode.active = false } cc.loader.loadRes(url2, cc.SpriteAtlas, (error, atlas) => { if (error) { cc.warn(`$警告:加載資源${url2}失敗!`); self.maskNode.active = false return; } self.playMaskAnimation(name); }); cc.loader.loadRes(url3, cc.SpriteAtlas, (error, atlas) => { if (error) { // cc.warn(`$警告:加載資源${url3}失敗!`); return; } self.playAddonAnimation(name + "_addon"); }); } }, // 播放動畫 playAnimation(name) { if (!SKUIUtil.isValid(this.roleNode)) { cc.warn(`$警告:角色播放動畫${name}失敗,角色節點無效`); return; } let anim = this.roleNode.getComponent(cc.Animation); if (!anim) { return; } var resid = 0; if (this.tResid > 0 && this.horseList.resId == 0) resid = this.tResid else resid = this.resid let dir = SKDataUtil.numberByString(name, "_", 1, 1); let clips = anim.getClips(); for (let clip of clips) { if (clip.name == name) { this.roleNode.active = true; this.roleNode.getComponent(cc.Animation).play(name); this.scheduleOnce(() => { if (SKUIUtil.isValid(this.roleNode) && this.roleNode.width > 0) { this.roleNode.scaleX = 500 / this.roleNode.width; this.roleNode.scaleY = 500 / this.roleNode.width; } else { cc.warn(`$警告:角色[${this.netInfo.roleid}]節點異常`); } }, 0); if (this.tResid == 0) WingUtil.playAni(this.bodyNode, this.resid, dir, name, 0, this.wingId); return; } } this.roleNode.active = false; let self = this; let url = `shap/${resid}/${name}`; cc.loader.loadRes(url, cc.SpriteAtlas, (error, atlas) => { if (error) { cc.warn(`$警告:加載角色動畫資源失敗${url}`); return; } if (!SKUIUtil.isValid(self.roleNode)) { cc.warn(`$警告:角色播放動畫${name}失敗,角色節點無效`); return; } if (this.netInfo.roleid == GameModel.player.roleid && GameModel.player.tResid != 0 && resid != GameModel.player.tResid) return let curFrames = atlas.getSpriteFrames(); let fn = 15; if(this.resid > 4038){ fn = 10; } let curClip = cc.AnimationClip.createWithSpriteFrames(curFrames, fn); curClip.name = name; if (name.substr(0, 5) == 'stand' || name.substr(0, 3) == 'run') { curClip.wrapMode = cc.WrapMode.Loop; } else { curClip.wrapMode = cc.WrapMode.Normal; } let nodeAni = self.roleNode.getComponent(cc.Animation); if (nodeAni) { nodeAni.addClip(curClip); nodeAni.play(name); } self.roleNode.active = true; if (this.tResid == 0) WingUtil.playAni(self.bodyNode, self.resid, dir, name, 0, self.wingId); self.scheduleOnce(() => { if (SKUIUtil.isValid(self.roleNode) && self.roleNode.width > 0) { self.roleNode.scaleX = 500 / self.roleNode.width; self.roleNode.scaleY = 500 / self.roleNode.width; } else { cc.warn(`$警告:角色[${self.netInfo.roleid}]節點異常`); } }, 0); }); }, // 播放遮罩 playMaskAnimation(name) { if (!SKUIUtil.isValid(this.maskNode)) { cc.warn(`$警告:角色播放動畫${name}失敗,角色節點無效`); return; } let anim = this.maskNode.getComponent(cc.Animation); if (!anim) { return; } let dir = SKDataUtil.numberByString(name, "_", 1, 1); let clips = anim.getClips(); for (let clip of clips) { if (clip.name == name) { this.maskNode.active = true; this.maskNode.getComponent(cc.Animation).play(name); return; } } this.maskNode.active = false; let self = this; let url = `shape_mask/${this.resid}/${name}`; cc.loader.loadRes(url, cc.SpriteAtlas, (error, atlas) => { if (error) { cc.warn(`$警告:加載角色動畫資源失敗${url}`); return; } if (!SKUIUtil.isValid(self.maskNode)) { cc.warn(`$警告:角色播放動畫${name}失敗,角色節點無效`); return; } let curFrames = atlas.getSpriteFrames(); let curClip = cc.AnimationClip.createWithSpriteFrames(curFrames, 15); curClip.name = name; if (name.substr(0, 5) == 'stand' || name.substr(0, 3) == 'run') { curClip.wrapMode = cc.WrapMode.Loop; } else { curClip.wrapMode = cc.WrapMode.Normal; } let nodeAni = self.maskNode.getComponent(cc.Animation); if (nodeAni) { nodeAni.addClip(curClip); nodeAni.play(name); } if (self.tResid > 0 && self.horseList.resId == 0){ self.maskNode.active = false; }else{ self.maskNode.active = true; } }); }, // 播放影子 playRoleshadowAnimation(name) { if (!SKUIUtil.isValid(this.RoleshadowNode)) { cc.warn(`$警告:角色影子播放動畫${name}失敗,角色節點無效`); return; } let anim = this.RoleshadowNode.getComponent(cc.Animation); if (!anim) { return; } let dir = SKDataUtil.numberByString(name, "_", 1, 1); let clips = anim.getClips(); for (let clip of clips) { if (clip.name == name) { this.RoleshadowNode.active = true; this.RoleshadowNode.getComponent(cc.Animation).play(name); return; } } this.RoleshadowNode.active = false; let self = this; let url = `ccbtex/shadow/${this.resid}_${name}_sw`; cc.loader.loadRes(url, cc.SpriteAtlas, (error, atlas) => { if (error) { cc.warn(`$警告:加載角色影子動畫資源失敗${url}`); return; } if (!SKUIUtil.isValid(self.RoleshadowNode)) { cc.warn(`$警告:角色影子播放動畫${name}失敗,角色節點無效`); return; } let curFrames = atlas.getSpriteFrames(); let curClip = cc.AnimationClip.createWithSpriteFrames(curFrames, 15); curClip.name = name; if (name.substr(0, 5) == 'stand' || name.substr(0, 3) == 'run') { curClip.wrapMode = cc.WrapMode.Loop; } else { curClip.wrapMode = cc.WrapMode.Normal; } let nodeAni = self.RoleshadowNode.getComponent(cc.Animation); if (nodeAni) { nodeAni.addClip(curClip); nodeAni.play(name); } if (self.tResid > 0 && self.horseList.resId == 0){ self.shadowNode.active = true; self.RoleshadowNode.active = false; }else{ self.RoleshadowNode.active = true; self.shadowNode.active = false; } }); }, // 播放附加動畫 playAddonAnimation(name) { let dir = SKDataUtil.numberByString(name, "_", 1, 1); if (dir == "1") { this.roleAddonNode = this.roleAddonBehindNode; this.roleAddonFrontNode.active = false } if (dir == "3") { this.roleAddonNode = this.roleAddonFrontNode; this.roleAddonBehindNode.active = false } if (!SKUIUtil.isValid(this.roleAddonNode)) { cc.warn(`$警告:角色播放動畫${name}失敗,角色節點無效`); return; } let anim = this.roleAddonNode.getComponent(cc.Animation); if (!anim) { return; } let clips = anim.getClips(); for (let clip of clips) { if (clip.name == name) { this.roleAddonNode.active = true; this.roleAddonNode.getComponent(cc.Animation).play(name); return; } } this.roleAddonNode.active = false; let self = this; let url = `shap/${this.resid}/${name}`; cc.loader.loadRes(url, cc.SpriteAtlas, (error, atlas) => { if (error) { cc.warn(`$警告:加載角色動畫資源失敗${url}`); return; } if (!SKUIUtil.isValid(self.roleAddonNode)) { cc.warn(`$警告:角色播放動畫${name}失敗,角色節點無效`); return; } let curFrames = atlas.getSpriteFrames(); let curClip = cc.AnimationClip.createWithSpriteFrames(curFrames, 15); curClip.name = name; if (name.substr(0, 5) == 'stand' || name.substr(0, 3) == 'run') { curClip.wrapMode = cc.WrapMode.Loop; } else { curClip.wrapMode = cc.WrapMode.Normal; } let nodeAni = self.roleAddonNode.getComponent(cc.Animation); if (nodeAni) { nodeAni.addClip(curClip); nodeAni.play(name); } self.roleAddonNode.active = true; }); }, playEff(id) { if (id == 0) { this.roleEffNode.active = false; return } var name = `${id}`; let anim = this.roleEffNode.getComponent(cc.Animation); if (!anim) { return; } let clips = anim.getClips(); for (let clip of clips) { if (clip.name == name) { this.roleEffNode.active = true; this.roleEffNode.getComponent(cc.Animation).play(name); return; } } this.roleEffNode.active = false; let self = this; let url = `body_eff/${name}`; cc.loader.loadRes(url, cc.SpriteAtlas, (error, atlas) => { if (error) { cc.warn(`$警告:加載角色動畫資源失敗${url}`); return; } if (!SKUIUtil.isValid(self.roleEffNode)) { cc.warn(`$警告:角色播放動畫${name}失敗,角色節點無效`); return; } let curFrames = atlas.getSpriteFrames(); let curClip = cc.AnimationClip.createWithSpriteFrames(curFrames, 10); curClip.name = name; curClip.wrapMode = cc.WrapMode.Loop; let nodeAni = self.roleEffNode.getComponent(cc.Animation); if (nodeAni) { nodeAni.addClip(curClip); nodeAni.play(name); } self.roleEffNode.active = true; }); }, addMovePath(pos) { if (this.onlyid == GameModel.player.onlyid && GameModel.player.teamid > 0 && GameModel.player.isleader) { this.movePath.push(pos); this.node.parent.getComponent('GameMapLogic').setTeamPath(); // if (this.movePath.length > 30) { // this.movePath.splice(0, this.movePath.length - 30); // } } }, objMove(row, line) { this._super(); let trow = Math.ceil(row); let tline = Math.ceil(line); this.node.stopAllActions(); if (this.actlist.length > 0) { if (!this.isOpenFootTimer) { this.isOpenFootTimer = true; this.addFootEffFunc() this.schedule(this.addFootEffFunc, 0.3, cc.macro.REPEAT_FOREVER, 0); } let curpos = this.actlist.shift(); let samerow = trow == Math.ceil(curpos.info.r); let sameline = tline == Math.ceil(curpos.info.l); let trowtmp = Math.ceil(curpos.info.r); let tlinetmp = Math.ceil(curpos.info.l); this.addMovePath({ r: curpos.info.r, l: curpos.info.l }); while (this.actlist.length > 1) { trowtmp = Math.ceil(curpos.info.r); tlinetmp = Math.ceil(curpos.info.l); let nextpos = this.actlist.shift(); if ((samerow && Math.ceil(nextpos.info.r) == trowtmp) || (sameline && Math.ceil(nextpos.info.l) == tlinetmp)) { curpos = nextpos; this.addMovePath({ r: curpos.info.r, l: curpos.info.l }); continue; } if ((!samerow && !sameline && Math.ceil(nextpos.info.r) != trowtmp && Math.ceil(nextpos.info.l) != tlinetmp)) { curpos = nextpos; this.addMovePath({ r: curpos.info.r, l: curpos.info.l }); continue; } this.actlist.unshift(nextpos); break; } line = curpos.info.l; row = curpos.info.r; } let end_pos = cc.v2(this.gridWidth / 2, this.gridHeight / 2).add(this.getMapPos(line, row)); let addspd = 0; if (this.onlyid != GameModel.player.onlyid && GameModel.player.teamid > 0 && GameModel.player.isleader && this.teamid == GameModel.player.teamid) { if (this.actlist.length > 5) { addspd = (this.actlist - 5) * 3; } } let speed = this.move_speed * this.horseList.getMoveSpeedScale(); let moveDelay = SKUIUtil.distanceByVec2(cc.v2(this.node.x, this.node.y), end_pos) / (speed + addspd); let self = this; this.node.runAction(cc.sequence(cc.moveTo(moveDelay, end_pos), cc.callFunc(() => { if (this.actlist.length > 0 && this.actlist[0].type == 2) { let act = this.actlist.shift(); self.addMovePath({ r: act.info.r, l: act.info.l }); self.objMove(act.info.r, act.info.l); } }))); let temindex = 0; if (this.actlist.length > 3) { temindex = 2; } else { temindex = this.actlist.length - 1; } let tempos = end_pos; if (temindex != -1) { let act = this.actlist[temindex]; tempos = SKUIUtil.add(cc.v2(this.gridWidth / 2, this.gridHeight / 2), this.getMapPos(act.info.l, act.info.r)); } let moveAngle = Math.atan2((tempos.y - this.node.y), (tempos.x - this.node.x)) * 180 / Math.PI; let deltaAngle = Math.abs(Math.abs(this.curangle) - Math.abs(moveAngle)); let horseResId = this.horseList.resId; if ((moveAngle > 5 && moveAngle < 175) || (moveAngle > 0 && (this.run_type == 0 || deltaAngle > 90))) { if ((moveAngle > 85 && this.bodyNode.scaleX < 0) || (moveAngle < 85 && this.bodyNode.scaleX > 0)) { this.bodyNode.scaleX *= -1; this.horseNode.scaleX *= -1; this.name2HorseNode.scaleX *= -1; this.name2Node.scaleX *= -1; this.nameImgTitleNode.scaleX *= -1; this.nameImgTitleHorseNode.scaleX *= -1; } if (this.run_type != 1) { this.run_type = 1; this.dir = 3; if (horseResId == 0) { this.loadResThenPlay(`run_${this.dir}`); if (this.tResid == 0) { this.addWeaponAnimationByLR("run") } else { this.weaponNode.active = false this.anotherWeaponNode.active = false } // CPubFunction.addWeaponAnimation(this.netInfo.weapon, this.weaponNode, this.roleNode, this, this.resid, 'run', this.dir); } else { HorseUtil.playAni(this.horseNode, this.resid, this.dir, "run", horseResId); WingUtil.playAni(this.horseNode, this.resid, this.dir, "stand", horseResId, this.wingId); } } this.curangle = moveAngle; } else if ((moveAngle > -175 && moveAngle < -5) || (moveAngle <= 0 && (this.run_type == 0 || deltaAngle > 90))) { if ((moveAngle > -85 && this.bodyNode.scaleX < 0) || (moveAngle < -85 && this.bodyNode.scaleX > 0)) { this.bodyNode.scaleX *= -1; this.horseNode.scaleX *= -1; this.name2HorseNode.scaleX *= -1; this.name2Node.scaleX *= -1; this.nameImgTitleNode.scaleX *= -1; this.nameImgTitleHorseNode.scaleX *= -1; } if (this.run_type != 2) { this.run_type = 2; this.dir = 1; if (horseResId == 0) { this.loadResThenPlay(`run_${this.dir}`); if (this.tResid == 0) this.addWeaponAnimationByLR("run") else { this.weaponNode.active = false this.anotherWeaponNode.active = false } // CPubFunction.addWeaponAnimation(this.netInfo.weapon, this.weaponNode, this.roleNode, this, this.resid, 'run', this.dir); } else { HorseUtil.playAni(this.horseNode, this.resid, this.dir, "run", horseResId); WingUtil.playAni(this.horseNode, this.resid, this.dir, "stand", horseResId, this.wingId); } } this.curangle = moveAngle; } }, playStop() { if (GameModel.player.teamid > 0 && (GameModel.player.tempLeave || GameModel.player.isleader)) { if (this.onlyid != GameModel.player.onlyid && GameModel.player.getLogic().living_state != 0) { this.living_state = 0; return; } } if (this.actlist.length > 0) { this.actlist = []; this.node.stopAllActions(); } if (this.living_state == 0) { return; } if (this.isOpenFootTimer) { this.unschedule(this.addFootEffFunc); this.isOpenFootTimer = false; } this.move_tiems = 0; this.living_state = 0; let horseResId = this.horseList.resId; if (this.run_type == 1) { this.dir = 3; if (horseResId == 0) { this.loadResThenPlay(`stand_${this.dir}`); if (this.tResid == 0) this.addWeaponAnimationByLR("stand") else { this.weaponNode.active = false this.anotherWeaponNode.active = false } // CPubFunction.addWeaponAnimation(this.netInfo.weapon, this.weaponNode, this.roleNode, this, this.resid, 'stand', this.dir); } else { HorseUtil.playAni(this.horseNode, this.resid, this.dir, "stand", horseResId); WingUtil.playAni(this.horseNode, this.resid, this.dir, "stand", horseResId, this.wingId); } } else { this.dir = 1; if (horseResId == 0) { this.loadResThenPlay(`stand_${this.dir}`); if (this.tResid == 0) this.addWeaponAnimationByLR("stand") else { this.weaponNode.active = false this.anotherWeaponNode.active = false } // CPubFunction.addWeaponAnimation(this.netInfo.weapon, this.weaponNode, this.roleNode, this, this.resid, 'stand', this.dir); } else { HorseUtil.playAni(this.horseNode, this.resid, this.dir, "stand", horseResId); WingUtil.playAni(this.horseNode, this.resid, this.dir, "stand", horseResId, this.wingId); } } this.run_type = 0; if (this.onlyid != GameModel.player.onlyid) { return; } if (GameModel.player.teamid == 0 || GameModel.player.isleader || GameModel.player.tempLeave) { this.move_tiems = 0; let pathlist = []; for (let index = 0; this.movePath.length > index * 5 && pathlist.length < 5; index++) { let pos = this.movePath[this.movePath.length - 5 * index - 1]; pathlist.push({ x: Math.round(pos.l), y: Math.round(pos.r) }); } GameModel.send('c2s_aoi_stop', { accountid: this.netInfo.accountid, roleId: this.netInfo.roleid, x: this.netInfo.x, y: this.netInfo.y, path: SKDataUtil.toJson(pathlist) }); let gamelogic = cc.find('Canvas').getComponent('GameLogic'); gamelogic.autoNode.active = false; } this.node.parent.getComponent('GameMapLogic').RoleStop(); //判斷是否到傳送點 this.OnArrive(); }, OnArrive() { if (GameUtil.arriveCallback == null) { return; } if (this.onlyid != GameModel.player.onlyid) { return; } if (SKDataUtil.distance({ x: GameUtil.arriveCallback.x, y: GameUtil.arriveCallback.y }, { x: this.netInfo.x, y: this.netInfo.y }) <= 2) { GameUtil.arriveCallback.callback(); GameUtil.arriveCallback = null; } }, checkPos() { let change = false; let tline = Math.floor(this.node.x / this.gridWidth); let trow = Math.floor(this.node.y / this.gridHeight); if (this.netInfo.x != tline || this.netInfo.y != trow) { this.netInfo.x = tline; this.netInfo.y = trow; change = true; } if (GameModel.player.accountid == this.netInfo.accountid) { if (change) { let flag = SKDataUtil.intOf2Array(this.gridInfoArr, trow, tline, 2); if (flag == 2) { this.node.opacity = 150; } else { this.node.opacity = 255; } this.move_tiems++; let gamelogic = (cc.find('Canvas')).getComponent('GameLogic'); gamelogic.uiLogic.setPosition(tline, trow); } if (this.move_tiems >= 5) { this.move_tiems = 0; if (GameModel.player.teamid == 0 || GameModel.player.isleader || GameModel.player.tempLeave) { GameModel.send('c2s_aoi_move', { accountid: this.netInfo.accountid, roleId: this.netInfo.roleid, x: this.netInfo.x, y: this.netInfo.y }); } } } }, checkInTeam() { if (GameModel.player.teamid == 0 || !GameModel.player.isleader || !GameModel.player.tempLeave) { return false; } if (!GameModel.player.teamInfo.objlist || !Array.isArray(GameModel.player.teamInfo.objlist)) { return false; } for (let index = 1; index < GameModel.player.teamInfo.objlist.length; index++) { let obj = GameModel.player.teamInfo.objlist[index]; if (obj.livingtype != 1) { return false; } if (obj.onlyid == this.onlyid) { return true; } } return false; }, setObjPos(x, y) { this._super(x, y); this.netInfo.x = x; this.netInfo.y = y; }, OnClick() { if (!this.node.active) { return; } if (this.onlyid == GameModel.player.onlyid) { return; } let goBtnAvater = CPubFunction.CreateSubNode(cc.find('Canvas/MainUI'), { nX: 230, nY: 120 }, this.btnPlayerAvatar, 'btnPlayerAvatar'); goBtnAvater.getComponent('PlayerAvatar').PlayerAvatar_Init(this.netInfo); }, showLevelUp() { this.playEffectStr('levelup', 0, 0); }, playEffectStr(strEffect, x, y) { let play = () => { CPubFunction.CreateSubFrame(this.roleNode, { nX: x, nY: y }, this.effect, strEffect); }; if (this.effect == null) { let self = this; cc.loader.loadRes("Prefabs/EffectFrame", function (err, prefab) { self.effect = prefab; if (!SKUIUtil.isValid(self.roleNode)) { cc.warn(`$警告:角色播放特效失敗,角色節點無效`); return; } play(); }); } else { play(); } }, getCurAnimateName() { // let animation = this.roleNode.getComponent(cc.Animation); // if (animation) { // return animation.currentClip.name; // } // return null; }, showColorMask1(color1, color2) { if (color1.r == 0 && color1.g == 0 && color1.b == 0 && color2.r == 0 && color2.g == 0 && color2.b == 0) { this.unshowColorMask(); } else { // this.maskNode = true; this.maskNode.active = true; this.zqmaskNode.active = true; } this.scheduleOnce(() => { let logic = this.maskNode.getComponent('role_color'); let zqlogic = this.zqmaskNode.getComponent('role_color'); if (color1.r != 0 || color1.g != 0 || color1.b != 0) { let t = Math.floor(color1.r) * 1000000 + Math.floor(color1.g) * 1000 + Math.floor(color1.b); logic.dH1 = t; zqlogic.dH1 = t; } else { logic.dH1 = 0; zqlogic.dH1 = 0; } if (color2.r != 0 || color2.g != 0 || color2.b != 0) { let t = Math.floor(color2.r) * 1000000 + Math.floor(color2.g) * 1000 + Math.floor(color2.b); logic.dH2 = t; zqlogic.dH2 = t; } else { logic.dH2 = 0; zqlogic.dH2 = 0; } }, 0); }, forzenRole() { this.isBing = true; this.loadEff("effect/bing", true, 0, 0, null) } });