2025-04-24 17:03:28 +08:00

615 lines
21 KiB
JavaScript

import LiveEntity from "../ts/core/LiveEntity";
import GameModel from "../ts/core/GameModel";
import SKUIUtil from "../ts/gear_2.3.4/util/SKUIUtil";
import { EDir } from "../ts/core/EEnum";
import SKDataUtil from "../ts/gear_2.3.4/util/SKDataUtil";
import GameUtil from "../ts/core/GameUtil";
import MsgAlert from "../ts/game/msg/MsgAlert";
import WeaponUtil from "../ts/weapon/WeaponUtil";
let CPubFunction = require('./PubFunction');
let CSpeak = require('./Speak');
let CMainPlayerInfo = require('./MainPlayerInfo');
let pTaskConfigMgr = require('./task_config').g_pTaskConfigMgr;
let EState = require('./task_config').EState;
let EEventType = require('./task_config').EEventType;
let pNpcMgr = require('./NpcMgr');
let ENpcKind = {
ERole: 1,
EThing: 2,
EBomb: 3,
EPao: 4,
ETower: 5,
};
cc.Class({
extends: LiveEntity,
properties: {
NpcFunUI: cc.Prefab,
},
onLoad() {
this._super();
this.nConfigID = 0;
this.obj_type = 0;
this.resid = 0;
this.run_type = 0;
this.move_speed = 280;
this.move_tiems = 0;
this.animationNode = this.node.getChildByName("role");
this.weaponNode = this.animationNode.getChildByName('weapon');
this.nameNode = this.node.getChildByName('name');
this.starTypeNameNode = this.node.getChildByName('starTypeName');
this.moveAngle = 0;
this.weaponname = '';
this.resUrl = '';
this.towerGangid = 0;
this.hp = 450
},
start() {
this.schedule(this.objUpdate, 1, cc.macro.REPEAT_FOREVER, 0.1);
},
onDestroy() {
},
clear() {
let weaponNode = this.weaponNode;
if (weaponNode) {
let clips = weaponNode.getComponent(cc.Animation).getClips();
for (const clip of clips) {
weaponNode.getComponent(cc.Animation).stop(clip.name);
weaponNode.getComponent(cc.Animation).removeClip(clip, true);
}
}
let animationNode = this.animationNode;
if (animationNode) {
let clips = animationNode.getComponent(cc.Animation).getClips();
for (const clip of clips) {
animationNode.getComponent(cc.Animation).stop(clip.name);
animationNode.getComponent(cc.Animation).removeClip(clip, true);
}
}
},
setInfo(objinfo) {
this.netInfo = objinfo;
if (this.netInfo.x < 0 || this.netInfo.y < 0) {
this.netInfo.x = 0;
this.netInfo.y = 0;
}
this.x = objinfo.x;
this.y = objinfo.y;
this.onlyid = objinfo.onlyid;
this.resid = objinfo.resid;
this.name = objinfo.name;
this.nConfigID = objinfo.npcconfig;
this.nameNode.getComponent(cc.Label).string = objinfo.name;
if (objinfo.type == 1) {
this.starTypeNameNode.getComponent(cc.Label).string = "地煞" + objinfo.level + "星";
this.nameNode.y = -37;
this.starTypeNameNode.active = true
}
else if (objinfo.type == 2) {
this.starTypeNameNode.getComponent(cc.Label).string = "星君下凡" + objinfo.level + "星";
this.nameNode.y = -37;
this.starTypeNameNode.active = true
} else if (objinfo.type == 3) {
this.starTypeNameNode.getComponent(cc.Label).string = objinfo.name + "星君";
this.nameNode.y = -37;
this.starTypeNameNode.active = true
} else if (objinfo.type == 8) {
this.starTypeNameNode.getComponent(cc.Label).string = "金蟾送福";
this.nameNode.y = -37;
this.starTypeNameNode.active = true;
} else if (objinfo.type == 9) {
this.starTypeNameNode.getComponent(cc.Label).string = "金蟾送寶";
this.nameNode.y = -37;
this.starTypeNameNode.active = true;
}
if (this.nConfigID >= 47205 && this.nConfigID <= 47208) {
this.initAnimation("die");
} else
this.initAnimation();
let nID = GameModel.conf_map[objinfo.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);
if (GameModel.conf_res_anchor[this.resid]) {
this.animationNode.anchorX = CPubFunction.GetDefault(GameModel.conf_res_anchor[this.resid].anchorX, 0.5);
this.animationNode.anchorY = CPubFunction.GetDefault(GameModel.conf_res_anchor[this.resid].anchorY, 0.3);
}
if (this.gridInfoArr[this.netInfo.y][this.netInfo.x] == 2) {
this.node.opacity = 150;
}
if (this.nConfigID == 10050) {
var btn = this.node.getChildByName("Button");
btn.anchorX = 0.4
btn.anchorY = 0.72
btn.width = 370
btn.height = 300
this.nameNode.x = 35;
this.nameNode.y = -140;
}
if (this.nConfigID >= 7205 && this.nConfigID <= 7208) {
GameModel.towerNpcList[`${this.nConfigID}`] = this
GameModel.send("c2s_gang_tower", {
roleId: GameModel.player.roleid,
towerId: this.nConfigID
})
}
},
initAnimation(act = "stand", dir = 1, loop = true) {
if (!this.animationNode) return
this.animationNode.active = false;
this.resUrl = `shap/${this.resid}/${act}_${dir}`;
let self = this;
cc.loader.loadRes(this.resUrl, cc.SpriteAtlas, function (error, atlas) {
if (error) {
cc.warn(`$警告:加載NPC資源錯誤:${self.resUrl}`);
return;
}
if (!SKUIUtil.isValid(self.node)) {
return;
}
if (!atlas) {
return;
}
let curFrames = atlas.getSpriteFrames();
let fn = 10;
if (self.resid <= 4038) {
fn = 15;
}
let curClip = cc.AnimationClip.createWithSpriteFrames(curFrames, fn);
curClip.name = `${act}_${dir}`;
if (loop)
curClip.wrapMode = cc.WrapMode.Loop;
let nodeAni = self.animationNode.getComponent(cc.Animation);
nodeAni.stop()
nodeAni.addClip(curClip);
nodeAni.play(`${act}_${dir}`);
if (self.resid == 6142) {
} else {
self.scheduleOnce(() => {
let xDir = 1;
if (self.netInfo.dir == EDir.LEFT || self.netInfo.dir == EDir.RIGHT) {
xDir = -1;
}
if (self.resid != 7209) {
self.animationNode.scaleY = 450 / self.animationNode.height;
self.animationNode.scaleX = 450 / self.animationNode.width * xDir;
} else {
self.animationNode.scaleY = 1.28;
self.animationNode.scaleX = 1.28 * xDir;
if (GameModel.conf_res_anchor[self.resid] && act != "run") {
if (act == "attack" && dir == 1) {
self.animationNode.anchorX = 0.46;
self.animationNode.anchorY = 0.62;
} else {
self.animationNode.anchorX = CPubFunction.GetDefault(GameModel.conf_res_anchor[self.resid].anchorX, 0.5);
self.animationNode.anchorY = CPubFunction.GetDefault(GameModel.conf_res_anchor[self.resid].anchorY, 0.3);
}
}
}
}, 0);
}
self.animationNode.active = true;
//CPubFunction.addWeaponAnimation('', self.weaponNode, self.animationNode, self, self.resid, act, 1);
WeaponUtil.addWeaponAnimation('', self.weaponNode, self.animationNode, self, self.resid, act, 1, 1);
});
if (this.nConfigID >= 7205 && this.nConfigID <= 7208 && this.hp > 0) {
this.loadEff(`shap/${this.resid}/stand_1_ef`, true, -5, 75, null)
var hp = this.node.getChildByName("hp").getComponent(cc.ProgressBar);
hp.node.active = true
}
},
changeHp(value) {
if (!this.node) return
var hp = this.node.getChildByName("hp").getComponent(cc.ProgressBar);
this.hp = value
if (value > 0) {
hp.node.active = true
hp.progress = value / 450
} else {
hp.node.active = false
this.deleteEffNode()
this.initAnimation("die", 1, 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;
}
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;
}
let effNode = cc.instantiate(prefab);
effNode.name = "effNode"
effNode.x = x
effNode.y = y
effNode.parent = self.node
effNode.getComponent("Effect").CreateAndPlayAnimation(curClip, cb)
})
})
},
deleteEffNode() {
if (!this.node) return
for (let i = this.node.children.length - 1; i > 0; i--) {
if (this.node.children[i].name == "effNode")
this.node.children[i].destroy()
}
},
Npc_Init(strDefaultTalk, mapButton) {
this.strDefaultTalk = strDefaultTalk;
this.mapButton = mapButton;
this.mapTaskBtn = {};
},
ReconTaskBtnList() {
this.mapTaskBtn = {};
for (let key in CMainPlayerInfo.vecTaskState) {
let stTaskState = CMainPlayerInfo.vecTaskState[key];
let stTaskConfig = pTaskConfigMgr.GetTaskInfo(stTaskState.nTaskID);
for (let itStep in stTaskState.vecStepState) {
if (stTaskState.vecStepState[itStep].nState != EState.EDoing)
continue;
let stStep = stTaskConfig.vecEvent[itStep];
if (stStep.nEventType == EEventType.PlayerTalkNpc) {
if (stStep.vecNpc[0] != this.nConfigID)
continue;
let vecTmp = CPubFunction.GetTaskTalkList(stTaskConfig.nTaskID, itStep);
this.mapTaskBtn[stTaskConfig.strTaskName] = { vecTmp: vecTmp, nTaskID: stTaskState.nTaskID, nStep: itStep };
}
if (stStep.nEventType == EEventType.PlayerGiveNpcItem) {
if (stStep.nNpcConfigID != this.nConfigID)
continue;
let vecTmp = [];
this.mapTaskBtn[stTaskConfig.strTaskName] = { vecTmp: vecTmp, nTaskID: stTaskState.nTaskID, nStep: itStep };
}
if (stStep.nEventType == EEventType.PlayerKillNpc) {
for (let it2 in stStep.vecNpc) {
if (stStep.vecNpc[it2] != this.nConfigID)
continue;
this.mapTaskBtn[stTaskConfig.strTaskName] = { vecTmp: [], nTaskID: stTaskState.nTaskID, nStep: itStep };
break;
}
}
}
}
},
checklevelLimit() {
},
CloseCurUI() {
CPubFunction.FindAndDeleteNode(cc.find('Canvas/MainUI'), "NpcFunUI");
CPubFunction.FindAndHidenNode(cc.find('Canvas/MainUI'), { nX: 0, nY: -1000 });
},
OpenFunctionUI() {
let npcName = cc.find('name', this.node).getComponent(cc.Label).string;
let goNpcFunUI = SKUIUtil.createSubNode(cc.find('Canvas/MainUI'), cc.v2(300, 0), this.NpcFunUI, 'NpcFunUI');
let npcFunUI = goNpcFunUI.getComponent('NpcFunUI');
if (npcFunUI) {
npcFunUI.NpcFunUI_Init(this.GetOnlyID(), this.nConfigID, npcName, this.strDefaultTalk, this.GetFunctionMapBtn(), this.mapTaskBtn);
}
},
OpenTowerFunctionUI(data) {
GameModel.towerNpc = null
let npcName = cc.find('name', this.node).getComponent(cc.Label).string;
let goNpcFunUI = SKUIUtil.createSubNode(cc.find('Canvas/MainUI'), cc.v2(300, 0), this.NpcFunUI, 'NpcFunUI');
let npcFunUI = goNpcFunUI.getComponent('NpcFunUI');
var talk = "";
if (this.towerGangid == GameModel.player.bangid) {
talk = `這是我方的能量塔,補充能量可以開砲哦`
} else {
talk = `這是敵方能量塔,耐久剩餘${data.durable}`
}
if (npcFunUI) {
npcFunUI.NpcFunUI_Init(this.GetOnlyID(), this.nConfigID, npcName, talk, this.GetFunctionMapBtn(), this.mapTaskBtn);
}
},
GetOnlyID() {
let valid = SKUIUtil.isValid(this.node);
if (!valid) {
return 0;
}
let npc = this.node.getComponent('Npc');
if (npc) {
let result = npc.onlyid;
return result;
}
return 0;
},
IsGrass() {
let resid = this.node.getComponent('Npc').resid;
if (resid == 2003)
return true;
return false;
},
GetKind() {
let stConfig = pNpcMgr.GetNpcConfigInfo(this.nConfigID);
return stConfig.nKind;
},
OnGrassClick() {
GameUtil.createWaitTip('採集', 1, () => {
GameModel.send('c2s_act_npc', { nOnlyID: this.GetOnlyID(), nNpcConfigID: this.nConfigID, });
});
},
OnBombClick() {
GameModel.send('c2s_trigle_npc_bomb', { nNpcConfigID: this.nConfigID, nNpcOnlyID: this.GetOnlyID() });
},
OnPaoClick() {
if (GameModel.needKeep) return
if (GameModel.player.isleader && GameModel.player.teamInfo) {
var roleNum = 0;
for (let i in GameModel.player.teamInfo.objlist) {
if (SKDataUtil.hasProperty(GameModel.player.teamInfo.objlist[i], "accountid"))
roleNum++
}
if (roleNum < 1) {
MsgAlert.addMsg("需要組隊且三人及以上才行哦")
return
}
} else {
MsgAlert.addMsg("需要組隊且三人及以上才行哦")
return
}
GameModel.paoNpc = this;
GameModel.send("c2s_ask_fortifications", {
roleId: GameModel.player.roleid,
type: 1,
serial: 1,
is: 0
})
GameModel.needKeepType = 1
GameModel.serial = 1
},
// 大砲蓄力
OnPaoClickCB() {
if (GameModel.needKeep) return
this.initAnimation("run")
this.animationNode.anchorX = 0.4;
this.animationNode.anchorY = 0.495;
GameUtil.createWaitTip2('蓄力中', 20, () => {
GameModel.needKeep = false
});
GameModel.needKeep = true
},
paoBoom(data) {
GameUtil.breakWaitTip2(false);
GameUtil.waitNode.stopAllActions()
GameUtil.waitNode.destroy()
var dir = data.direction == "L" ? 1 : 3
this.initAnimation("attack", dir, false)
GameModel.needKeep = false
this.scheduleOnce(() => {
this.initAnimation()
}, 1.2)
if (dir == 3)
this.scheduleOnce(() => {
this.loadEff(`shap/7209/attack_${dir}_ef`, false, 440, 290)
}, 0.4)
else
this.scheduleOnce(() => {
this.loadEff(`shap/7209/attack_${dir}_ef`, false, 50, -20)
}, 0.5)
},
OnTowerClick() {
GameModel.towerNpc = this;
GameModel.send("c2s_gang_tower", {
roleId: GameModel.player.roleid,
towerId: this.nConfigID
})
},
// 砲塔蓄力
OnTowerKeepCB() {
GameModel.towerNpc = null;
GameModel.needKeep = true
GameUtil.createWaitTip3('蓄力中', 20, () => {
GameModel.needKeep = false
});
},
GetFunctionMapBtn() {
let mapTmp = Object.assign({}, this.mapButton);
for (let key in mapTmp) {
if (key.indexOf('daily') == -1)
continue;
if (this.nConfigID == 10067) { // 牛百色變色功能屏掉
delete mapTmp(key);
continue;
}
if (this.nConfigID == 30062 && GameModel.player.race != 1) // 菩提祖師-人族
{
delete mapTmp[key];
continue;
}
if (this.nConfigID == 10118 && GameModel.player.race != 2) // 太上老君-仙族
{
delete mapTmp[key];
continue;
}
if (this.nConfigID == 30063 && GameModel.player.race != 3) // 牛魔王-魔族
{
delete mapTmp[key];
continue;
}
if (this.nConfigID == 30065 && GameModel.player.race != 4) // 聶小倩-鬼族
{
delete mapTmp[key];
continue;
}
if (this.nConfigID == 70006 && GameModel.player.race != 5) // 龍首木-龍族
{
delete mapTmp[key];
continue;
}
if (this.nConfigID == 10240 && GameModel.player.level < 28) // 程咬金
{
delete mapTmp[key];
continue;
}
let vecTmp = key.split(":");
if (CMainPlayerInfo.IsAlreadyHasThisGropTask(vecTmp[1])) {
delete mapTmp[key];
continue;
}
}
// 自定義去掉按鈕
for (let key in mapTmp) {
if (this.nConfigID == 10240 && GameModel.player.level < 28) // 程咬金
{
delete mapTmp[key];
// 自定義對話
this.strDefaultTalk = "聽聞孫悟空的金箍棒也是厲害的很,你說和我的三板斧比怎樣?"
continue;
}
}
for (let key in mapTmp) {
if (this.nConfigID >= 7205 && this.nConfigID <= 7208) // 幫戰塔
{
if (this.towerGangid == GameModel.player.bangid && mapTmp[key] == "果斷開打")
delete mapTmp[key];
if (this.towerGangid != GameModel.player.bangid && mapTmp[key] == "開始補充")
delete mapTmp[key];
continue;
}
}
return mapTmp;
},
OnHumanClick() {
if (this.nConfigID == 10055) {
// 判斷是否再幫戰比武場
var inBox = GameUtil.pnpoly(4, [167, 194, 169, 141], [39, 24, 12, 26], GameModel.player.x, GameModel.player.y)
if (!inBox) {
let stSpeak = new CSpeak(this.node.getComponent('Npc').resid, this.strDefaultTalk, cc.find('name', this.node).getComponent(cc.Label).string, 2); // Npc 默認的自言自語黑框
CPubFunction.CreateNpcTalk([stSpeak], null);
return
}
}
this.ReconTaskBtnList();
if (CPubFunction.GetMapLen(this.GetFunctionMapBtn()) > 0) {
this.OpenFunctionUI();
return;
}
if (CPubFunction.GetMapLen(this.mapTaskBtn) > 1) {
this.OpenFunctionUI();
}
else if (CPubFunction.GetMapLen(this.mapTaskBtn) == 1) {
let pSelf = this;
let stData = CPubFunction.GetMapDataByIndex(this.mapTaskBtn, 0);
CPubFunction.CreateNpcTalk(stData.vecTmp, (data) => {
GameModel.send('c2s_task_talk_npc', { nTaskID: stData.nTaskID, nStep: stData.nStep, nNpcConfigID: pSelf.nConfigID, nNpcOnlyID: pSelf.GetOnlyID() });
});
}
else //沒有功能 沒有任務
{
if (this.strDefaultTalk && this.strDefaultTalk != '') {
let stSpeak = new CSpeak(this.node.getComponent('Npc').resid, this.strDefaultTalk, cc.find('name', this.node).getComponent(cc.Label).string, 2); // Npc 默認的自言自語黑框
CPubFunction.CreateNpcTalk([stSpeak], null);
}
}
},
OnNpcClick() {
if (GameModel.player.getLogic().isBing) {
MsgAlert.addMsg("冰凍中,不可進行操作")
return
}
let comRole = this.node.getComponent('Npc');
let nDistance = SKDataUtil.distance({ x: GameModel.player.x, y: GameModel.player.y }, { x: comRole.x, y: comRole.y });
if (nDistance >= 20)
return;
this.CloseCurUI();
let nKind = this.GetKind();
if (nKind == ENpcKind.ERole) {
this.OnHumanClick();
}
if (nKind == ENpcKind.EThing) {
this.OnGrassClick();
}
if (nKind == ENpcKind.EBomb) {
this.OnBombClick();
}
if (nKind == ENpcKind.EPao) {
this.OnPaoClick();
}
if (nKind == ENpcKind.ETower) {
this.OnTowerClick();
}
},
});