348 lines
11 KiB
TypeScript
Raw Normal View History

2023-11-01 19:07:15 +08:00
import { Vec2 } from "cc";
2023-11-01 02:01:35 +08:00
import GBaseMode from "../GBaseMode";
import { GRoleUtil } from "../entity/GRole";
import { GTactical } from "../entity/GTactical";
2023-11-01 19:07:15 +08:00
import GRoleDefault from "../base/role/GRoleDefault";
import { Prefab } from "cc";
import { _decorator } from "cc";
import { instantiate } from "cc";
import { GPVPModePlayerEnum } from "./GPVPMode";
import { JNFrameInfo } from "../../../../extensions/ngame/assets/ngame/sync/frame/JNSyncFrame";
2023-11-03 02:57:38 +08:00
import { GMapLoop } from "../base/common/map/GMapLoop";
import { Node } from "cc";
import JNFrameTime from "../../../../extensions/ngame/assets/ngame/sync/frame/game/time/JNFrameTime";
2023-11-06 02:25:02 +08:00
import { TD, app } from "../../App";
2023-11-03 02:57:38 +08:00
import { v3 } from "cc";
2023-11-03 19:01:58 +08:00
import { v2 } from "cc";
import GFSMOnHookMode from "./OnHook/GFSMOnHookMode";
2023-12-23 19:00:53 +08:00
import { TB, TbGEntity } from "../../config/data/schema";
2023-11-16 19:10:19 +08:00
import PlayerTacticalData, { PlayerTacticalEvent } from "../../data/PlayerTacticalData";
2023-11-17 18:29:39 +08:00
import GRoleOnHookPlayerExpand from "../base/role/expand/OnHook/GRoleOnHookPlayerExpand";
2023-11-16 19:10:19 +08:00
import PlayerPetData from "../../data/PlayerPetData";
import { GUI } from "../../ui/UIConfig";
2023-11-17 18:29:39 +08:00
import { GOnHookPet, GOnHookPets } from "../../../../extensions/ngame/assets/ngame/message/proto";
2023-12-03 03:31:19 +08:00
import GOnHookManager, { GOnHookManagerEvent } from "../../manager/battle/mode/GOnHookManager";
2023-11-17 18:29:39 +08:00
import GRoleOnHookCreepsExpand from "../base/role/expand/OnHook/GRoleOnHookCreepsExpand";
2023-11-30 02:20:57 +08:00
import GPetAttribute from "../base/values/attribute/role/GPetAttribute";
2023-12-03 03:31:19 +08:00
import GOnHookData from "../../data/GOnHookData";
2023-12-23 19:00:53 +08:00
import { GModeEvent, GModeHitInfo } from "./GMode";
2024-01-11 02:46:36 +08:00
import GBattleData, { GBattleDataEnum } from "../../data/GBattleData";
2024-01-17 18:36:59 +08:00
import GNormalModeBase, { GNormalModePlayerEnum } from "./default/GNormalModeBase";
2023-11-01 19:07:15 +08:00
const { ccclass, property } = _decorator;
2023-11-01 02:01:35 +08:00
2023-11-03 19:01:58 +08:00
//挂机模式状态
export enum GOnHookModeState{
GoTarget,//前往目标
Attack, //攻击
AttackEnd, //攻击结束
}
2023-11-01 02:01:35 +08:00
/**
2023-11-17 18:29:39 +08:00
* ( 使 API)
2023-11-01 02:01:35 +08:00
*/
2023-11-01 19:07:15 +08:00
@ccclass('GOnHookMode')
2024-01-17 18:36:59 +08:00
export default class GOnHookMode extends GNormalModeBase<{},{}>{
2023-11-03 02:57:38 +08:00
@property(Node)
objects: Node = null;
get scene():Node{
return this.objects;
}
2023-11-01 02:01:35 +08:00
2023-11-01 19:07:15 +08:00
//玩家宠物
playerRoles: GRoleDefault[] = [];
//敌方宠物
enemyRoles: GRoleDefault[] = [];
2023-11-01 02:01:35 +08:00
2023-11-03 19:01:58 +08:00
//每一波怪的距离
2023-11-04 05:56:28 +08:00
everyX:number = 600;
2023-11-03 19:01:58 +08:00
//下一波怪的对战位置X
_nextFightX:number = 0;
get nextFightX(){return this._nextFightX}
set nextFightX(value:number){
//修改玩家阵法位置
this.playerInfo.tactical.setOffset(this.playerPos.clone().add(v2(value,0)))
2023-11-04 05:56:28 +08:00
this.enemyInfo.tactical.setOffset(this.enemyPos.clone().add(v2(value,0)))
2023-11-03 19:01:58 +08:00
this._nextFightX = value;
}
fsm:GFSMOnHookMode;
2023-11-05 03:26:09 +08:00
//是否允许攻击
isAllowAttack:boolean = false;
2024-01-03 15:51:16 +08:00
//是否战斗失败
isFail:boolean = false;
2024-01-17 18:36:59 +08:00
//让胜负失效
get isEndGame(){return true;}
2023-11-16 19:10:19 +08:00
//添加监听事件
addEvent(){
app.event.on(PlayerTacticalEvent.UPDATE_TACTICAL,this.onUpdatePlayerPet,this);
2024-01-11 02:46:36 +08:00
app.event.on(GBattleDataEnum.UPDARE_ATTRIBUTE_SUCCESS,this.onUpdateAttribute,this);
2023-12-05 01:43:43 +08:00
// app.event.on(GOnHookManagerEvent.UPDATE_MAP,this.onUpdateWorld,this);
2023-11-16 19:10:19 +08:00
}
//移除监听事件
onDestroy(){
super.onDestroy();
app.event.off(PlayerTacticalEvent.UPDATE_TACTICAL,this.onUpdatePlayerPet,this);
2024-01-11 02:46:36 +08:00
app.event.off(GBattleDataEnum.UPDARE_ATTRIBUTE_SUCCESS,this.onUpdateAttribute,this);
2023-12-05 01:43:43 +08:00
// app.event.off(GOnHookManagerEvent.UPDATE_MAP,this.onUpdateWorld,this);
2023-11-16 19:10:19 +08:00
}
2023-11-01 02:01:35 +08:00
onSyncInitSuccess():void{
//初始化战斗
console.log("GOnHookMode 模式初始化");
2024-01-17 18:36:59 +08:00
super.onSyncInitSuccess();
2023-11-03 02:57:38 +08:00
2023-11-03 19:01:58 +08:00
//初始化状态机
this.fsm = new GFSMOnHookMode(this);
2023-12-03 03:31:19 +08:00
//更新场景
this.onUpdateWorld();
2023-11-16 19:10:19 +08:00
this.onUpdatePlayerPet();
//添加监听
this.addEvent();
2023-11-17 02:57:46 +08:00
// //模拟请求生成宠物
// app.socket.SendBack(GAction.MODE_ON_HOOK_SPAWN_PET,{
// type:GActionType.GOnHookPets,
// fun:(info:GOnHookPets) => {
// console.log("接受到野怪列表",info)
// }
// })
2023-11-01 02:01:35 +08:00
//生成玩家
2024-01-17 18:36:59 +08:00
// this.playerInfo.roles.forEach((info,index) => this.onGenRole(GNormalModePlayerEnum.PLAYER,index + 1,info))
2023-11-03 19:01:58 +08:00
// //生成敌人
// this.onResetGenerateEnemy();
2023-11-01 02:01:35 +08:00
}
2023-12-03 03:31:19 +08:00
//更新地图
onUpdateWorld(){
let info = TD.TbGOnHookMaps.get(GOnHookData.getIns().info.onHookMap);
2023-12-05 01:43:43 +08:00
this.setWorldMap(info.mapId);
2023-12-03 03:31:19 +08:00
}
//更新页面
onUpdateView(){
}
2023-11-17 18:29:39 +08:00
2023-11-16 19:10:19 +08:00
//更新玩家宠物
onUpdatePlayerPet(){
//获取玩家阵容
let infos = PlayerTacticalData.getIns().getTacticalInfo();
//移除不再阵容中的宠物
2024-01-17 18:36:59 +08:00
let roles = [...this.getOnesRoleAlive(GNormalModePlayerEnum.PLAYER)]
2023-11-16 19:10:19 +08:00
roles.forEach(role => {
2023-11-17 18:29:39 +08:00
let expand = role.getComponent(GRoleOnHookPlayerExpand);
2023-11-16 19:10:19 +08:00
//如果宠物不再阵容中 则 移除宠物
if(infos.indexOf(expand.petId) < 0){
//移除宠物
this.playerRoles.splice(this.playerRoles.indexOf(role),1);
role.isDie = true;
}
})
infos.forEach((petId,index) => {
if(petId){
this.onGenPlayerPet(index+1,petId);
}
})
}
2024-01-11 02:46:36 +08:00
//更新属性
onUpdateAttribute(){
2024-01-17 18:36:59 +08:00
this.getOnesRole(GNormalModePlayerEnum.PLAYER).forEach(pet => {
2024-01-11 02:46:36 +08:00
pet.onEffectiveValue(GBattleData.getIns().data.getPetAttribute(pet.getComponent(GRoleOnHookPlayerExpand).petId));
});
}
2023-11-16 19:10:19 +08:00
//更新帧
2023-11-01 19:07:15 +08:00
onSyncUpdate(dt: number,frame:JNFrameInfo, input?: {}){
2023-11-03 19:01:58 +08:00
super.onSyncUpdate(dt,frame,input);
2023-11-04 05:56:28 +08:00
this.onUpdateMap(dt);
2023-11-03 19:01:58 +08:00
this.onUpdateCamera(dt);
this.fsm.onUpdate(dt,frame);
}
2023-11-04 05:56:28 +08:00
2023-11-03 19:01:58 +08:00
//更新相机逻辑
onUpdateCamera(dt:number){
//如果没有敌人相机永远锁定最前面的宠物
2023-11-05 03:26:09 +08:00
if(this.isAllowAttack && this.isHaveEnemy()){
//如果有敌人则移动到战斗位置
let cameraWorld = this.camera.node.worldPosition.clone();
this.camera.node.worldPosition = cameraWorld.lerp(v3(this.nextFightX,cameraWorld.y,cameraWorld.z),(dt / 1000));
2023-11-03 19:01:58 +08:00
2023-11-05 03:26:09 +08:00
}else{
2023-11-03 19:01:58 +08:00
//获取冲到最前面的宠物
2024-01-17 18:36:59 +08:00
let roles = this.getOnesRoleAlive(GNormalModePlayerEnum.PLAYER);
2023-11-03 19:01:58 +08:00
let frontRole = roles.sort((role1,role2) => role2.v2World.x - role1.v2World.x)[0];
if(!frontRole) return;
//设置相机 位置
let cameraWorld = this.camera.node.worldPosition.clone();
this.camera.node.worldPosition = cameraWorld.lerp(v3(frontRole.v2World.x,cameraWorld.y,cameraWorld.z),(dt / 1000));
}
2023-11-01 19:07:15 +08:00
}
2023-11-16 19:10:19 +08:00
//生成玩家宠物
onGenPlayerPet(index:number,petId:number){
//如果场上有这个宠物则更新阵法位置
let passRole:GRoleDefault;
this.playerRoles.forEach(role => {
2023-11-17 18:29:39 +08:00
if(role.getComponent(GRoleOnHookPlayerExpand).petId == petId)
2023-11-16 19:10:19 +08:00
passRole = role;
})
if(passRole){
//更新宠物阵法位置
passRole.tacticalIndex = index;
return;
}
//获取要生成的宠物
let info = PlayerPetData.getIns().petIdQueryPetInfo(petId);
if(!info){
app.layer.Open(GUI.Tips,{text:"未拥有当前上阵的宠物"});
return;
}
2024-01-17 18:36:59 +08:00
let role = this.onGenRole(GNormalModePlayerEnum.PLAYER,index,TD.TbGRole.get(info.petTbId));
2023-11-16 19:10:19 +08:00
//向宠物添加 OnHook 扩展
2023-11-17 18:29:39 +08:00
let expand = role.node.addComponent(GRoleOnHookPlayerExpand);
2023-11-16 19:10:19 +08:00
expand.petId = petId;
2023-11-30 02:20:57 +08:00
//添加宠物属性
2024-01-11 02:46:36 +08:00
role.onEffectiveValue(GBattleData.getIns().data.getPetAttribute(petId));
2023-11-30 02:20:57 +08:00
2023-11-16 19:10:19 +08:00
}
2023-11-17 18:29:39 +08:00
//生成野怪
onGenCreeps(index:number,creeps:GOnHookPet){
2024-01-17 18:36:59 +08:00
let role = this.onGenRole(GNormalModePlayerEnum.ENEMY,index,TD.TbGRole.get(creeps.petTbId));
2023-11-17 18:29:39 +08:00
//向野怪添加扩展
let expand = role.node.addComponent(GRoleOnHookCreepsExpand);
expand.creeps = creeps;
2023-11-30 02:20:57 +08:00
//添加野怪属性
2024-01-11 02:46:36 +08:00
role.onEffectiveValues(new GPetAttribute({
2023-11-30 02:20:57 +08:00
petId:0,
petPlayerId:0,
petTbId:creeps.petTbId,
2023-12-23 19:00:53 +08:00
petLevel:creeps.petLevel,
2023-11-30 02:20:57 +08:00
petStar:0,
petStarExp:0,
}));
2023-11-17 18:29:39 +08:00
}
2023-11-01 19:07:15 +08:00
//获取敌人
2024-01-17 18:36:59 +08:00
getEnumy(player:GRoleDefault,type:GNormalModePlayerEnum):GRoleDefault{
2023-11-01 19:07:15 +08:00
2023-11-05 03:26:09 +08:00
if(!this.isAllowAttack) return null;
2024-01-17 18:36:59 +08:00
return super.getEnumy(player,type);
2023-11-01 19:07:15 +08:00
}
//生成敌人
2024-01-03 15:51:16 +08:00
onResetFight(){
//初始化战斗失败
this.isFail = false;
2023-11-01 19:07:15 +08:00
this.enemyRoles = [];
2023-12-23 19:00:53 +08:00
let sign = TD.TbGOnHookMaps.get(GOnHookData.getIns().info.onHookMap).sign;
let table:{data:TbGEntity.TOnHookLevel} = TD[sign].get(GOnHookData.getIns().info.levelId);
for (let index = 0; index < table.data.petSize; index++) {
2023-12-25 02:06:56 +08:00
//获取敌人
let creeps = GOnHookManager.getIns().getNextCreeps();
if(!creeps) return; //没有获取到野怪则返回
2023-12-23 19:00:53 +08:00
this.onGenCreeps(index + 1,creeps);
}
2023-12-25 02:24:22 +08:00
this.onUpdatePlayerPet();
2024-01-17 18:36:59 +08:00
// this.enemyInfo.roles.forEach((info,index) => this.onGenRole(GNormalModePlayerEnum.ENEMY,index + 1,info));
2023-11-01 19:07:15 +08:00
}
//角色死亡回调
onRoleKillBack(role:GRoleDefault){
2024-01-17 18:36:59 +08:00
super.onRoleKillBack(role);
2024-01-03 15:51:16 +08:00
2023-11-17 18:29:39 +08:00
//如果死亡的是野怪则通知野怪死亡
if(role.getComponent(GRoleOnHookCreepsExpand)){
GOnHookManager.getIns().onKillSreeps(role.getComponent(GRoleOnHookCreepsExpand).creeps);
2024-01-03 15:51:16 +08:00
//如果野怪都死了 并且 战斗成功 则向服务器发送战斗成功
if(this.enemyRoles.length <= 0 && !this.isFail){
GOnHookManager.getIns().onWinLevel();
}
2023-11-17 18:29:39 +08:00
}
2024-01-03 15:51:16 +08:00
//如果死亡的是玩家宠物 并且 场上没有玩家宠物则重新战斗
if(role.getComponent(GRoleOnHookPlayerExpand)){
if(this.playerRoles.length <= 0){
//玩家战斗失败
this.isFail = true;
this.onUpdatePlayerPet();
}
}
2023-11-16 19:10:19 +08:00
2023-11-17 18:29:39 +08:00
}
2023-11-16 19:10:19 +08:00
//清理缓存
onClearCache(){
//清理宠物
let roles = [...this.playerRoles];
roles.forEach(role => {
if(!role.get()){
this.playerRoles.splice(this.playerRoles.indexOf(role),1);
}
})
roles = [...this.enemyRoles];
roles.forEach(role => {
if(!role.get()){
this.enemyRoles.splice(this.enemyRoles.indexOf(role),1);
}
})
}
2023-11-03 19:01:58 +08:00
//是否有怪物
isHaveEnemy(){
2023-11-05 03:26:09 +08:00
if(!this.isAllowAttack) return [];
2024-01-17 18:36:59 +08:00
return this.getOnesRoleAlive(GNormalModePlayerEnum.ENEMY).filter(role => !!role.get()).length > 0;
2023-11-03 19:01:58 +08:00
}
//前往下一个目标
onNextTarget(){
2023-11-04 05:56:28 +08:00
//下一个目标点
this.nextFightX = this.nextFightX + this.everyX;
2023-11-03 19:01:58 +08:00
2023-11-01 19:07:15 +08:00
}
2023-11-01 02:01:35 +08:00
}