/* 文件名:CharacterObjectClass.nut 路径:User/GameClass/ObjectClass/CharacterObjectClass.nut 创建日期:2024-05-11 21:03 文件用途:角色类 */ class GameObject.Character extends GameObject.ActiveObject { //时装 weapon_avatar = null; //武器装扮 aurora_avatar = null; //光环装扮 hair_avatar = null; //头部装扮 hat_avatar = null; //帽子装扮 face_avatar = null; //脸部装扮 breast_avatar = null; //胸部装扮 coat_avatar = null; //上衣装扮 skin_avatar = null; //皮肤装扮 waist_avatar = null; //腰部装扮 pants_avatar = null; //下装装扮 shoes_avatar = null; //鞋子装扮 //装备 shoulder = null; //护肩 coat = null; //上衣 pants = null; //下装 waist = null; //腰部 shoes = null; //鞋子 weapon = null; //武器 wrist = null; //手镯 amulet = null; //项链 ring = null; //戒指 title_name = null; //称号 support = null; //辅助装备 magic_stone = null; //魔法石 earring = null; //耳环 //装备 Equip = null; //动画对象管理器 AnimationManager = null; //附加项管理器 AdditionalItemsManager = null; //传送阵Flag TransmitFlag = false; //名字 Name = "无名字"; //职业编号 Job = 0; //转职职业 GrowJob = 0; //cid Cid = -1; //等级 Level = 60; //技能点 SkillPoint = 0; //经验值 Exp = 0; //疲劳值 Fatigue = 0; //控制器 Controller = null; //当前生命值 HP = 0; //当前魔法值 MP = 0; function _typeof() { return "Game_Character"; } function Init(Idx) { //初始化装备 Equip = {}; //初始化动画组 CurrentAni = []; //设置职业编号 this.Job = Idx; //获取角色职业信息 // Info = sq_DeepCopy(AssetManager.CharacterInfoList[Idx]); Info = AssetManager.CharacterInfoList[Idx]; base.Init(Info); //构造角色动画对象 AnimationManager = Character_Animation(); Addchild(AnimationManager); AnimationManager.Init(); //构造附加项 AdditionalItemsManager = Character_AdditionalItems(); Addchild(AdditionalItemsManager); AdditionalItemsManager.Init(); foreach(EquId in Info.default_avatar) { local EquObj = GameItem.Equipment(EquId); ChangeEquipment(EquObj); } } //开启控制 function OpenControl() { //分配控制器 Controller = Object_Controller(this); } function SyncObjectBox() { //同步受击框 和 攻击框 DamageBox = null; AttackBox = null; //皮肤同步受击框 武器同步攻击框 foreach(AniObj in CurrentAni) { if (AniObj.Type == "skin") { local Info = AniObj.GetCurrentFrameInfo(); if (Info.DamageBox.len() > 0) { DamageBox = []; foreach(Box in Info.DamageBox) { local NewBox = [Box[0] + X, Box[1] + Y, Box[2] + Z, Box[3] + X, Box[4] + Y, Box[5] + Z]; DamageBox.append(NewBox); } } } else if (AniObj.Type == "weapon") { local Info = AniObj.GetCurrentFrameInfo(); if (Info.AttackBox.len() > 0) { AttackBox = []; foreach(Box in Info.AttackBox) { local NewBox = [Box[0] + X, Box[1] + Y, Box[2] + Z, Box[3] + X, Box[4] + Y, Box[5] + Z]; AttackBox.append(NewBox); } } } } } //构造临时Ani function CreateTempAni(AniName) { //如果存在动画管理器则设置 if (AnimationManager) return AnimationManager.CreateTempAni(AniName); } //override //设置Ani function SetAnimation(Ani) { //如果存在动画管理器则设置 if (AnimationManager) AnimationManager.SetAnimation(Ani); } //读取全身装备的角色真实属性 function ReadFullEquipAttr() { foreach(Index, EquipObj in Equip) { this.Attr += EquipObj.Attr; } //城镇里给安排满血 if (typeof Parent == "townmap") { this.HP = this.Attr.HPMax; this.MP = this.Attr.MPMax; } } //脱下装备 function UnWearEquipment(Equ) { //脱下装备 如果原来的装备槽位置是空的 这里将会是null 不处理后续逻辑 if (!Equ) return; //如果当前装备槽已经有装备则移除 if (this[Equ.SlotType]) { //先保存一下原装备的槽类型 local ST = Equ.SlotType; this[Equ.SlotType].OnWearEnd(); this[Equ.SlotType] = null; //这里做判断 如果槽位类型模型有模型的话 要替换成默认的 if (AnimationManager.Default_Avatar.rawin(ST)) { this[ST] = AnimationManager.Default_Avatar[ST]; } } //如果是武器或者时装则同步动画 if (Equ.SlotType == "weapon" || Equ.Type == "avatar") { //变更时装 AnimationManager.Init(Equ.SlotType); //处理时装的隐藏图层 AnimationManager.HandlingHideLayers(); } //光环同步光环动画 else if (Equ.Type == "aurora") { AdditionalItemsManager.InitAuroa(); } } //穿戴装备 function WearEquipment(Equ) { //将装备对象赋值给对应装备槽 this[Equ.SlotType] = Equ; this[Equ.SlotType].OnWearStart(); //如果是武器或者时装则同步动画 if (Equ.SlotType == "weapon" || Equ.Type == "avatar") { //变更时装 AnimationManager.Init(Equ.SlotType); //处理时装的隐藏图层 AnimationManager.HandlingHideLayers(); } //光环同步光环动画 else if (Equ.Type == "aurora") { AdditionalItemsManager.InitAuroa(); } } //切换装备 function ChangeEquipment(Equ) { //如果当前装备槽已经有装备则移除 UnWearEquipment(Equ); //将装备对象赋值给对应装备槽 WearEquipment(Equ); } //切换装备列表 function ChangeEquipmentList(EquList) { foreach(Equ in EquList) { ChangeEquipment(Equ); } } //设置名字 function SetName(Name) { this.Name = Name; AdditionalItemsManager.SetName(Name); base.SetName(Name); } //设置聊天气泡 function SetChatBubble(Chat) { AdditionalItemsManager.SetChatBubble(Chat); } //是否为客户端玩家 function IsClientPlayer() { if (ClientCharacter && this.Cid == ClientCharacter.Cid) return true; return false; } //获取经验值 function GetExp() { return { current = this.Exp, max = AssetManager.CharacterExptable[this.Level] }; } //移动速度 Move_Speed = 500; //移动Flag MoveFlag = DIRECTION.NONE; //设置移动状态 function SetMoveFlag(Flag) { //状态有更改 if (Flag != this.MoveFlag) { this.MoveFlag = Flag; //站立状态 if (this.MoveFlag == DIRECTION.NONE) { AnimationManager.SetAnimation("RestAni"); } //移动状态 else { AnimationManager.SetAnimation("MoveAni"); } } } //移动逻辑 function MoveLogic(Dt) { if (!Parent) return; //没有移动状态 if (MoveFlag == DIRECTION.NONE) return; //在城镇里 if (typeof Parent == "townmap") { // 根据 MoveFlag 解出 X 和 Y local MX, MY; if (MoveFlag == DIRECTION.UP) { MX = 0; MY = -1; } else if (MoveFlag == DIRECTION.DOWN) { MX = 0; MY = 1; } else if (MoveFlag == DIRECTION.LEFT) { MX = -1; MY = 0; } else if (MoveFlag == DIRECTION.RIGHT) { MX = 1; MY = 0; } else if (MoveFlag == DIRECTION.UP_LEFT) { MX = -1; MY = -1; } else if (MoveFlag == DIRECTION.UP_RIGHT) { MX = 1; MY = -1; } else if (MoveFlag == DIRECTION.DOWN_LEFT) { MX = -1; MY = 1; } else if (MoveFlag == DIRECTION.DOWN_RIGHT) { MX = 1; MY = 1; } //设置人物朝向 if (MX > 0) SetDirection(DIRECTION.RIGHT); else if (MX< 0) SetDirection(DIRECTION.LEFT); MoveBy(Dt * MX * Move_Speed * 0.001, Dt * MY * Move_Speed * 0.001 * 0.71, 0); } } //更新 function OnUpdate(Dt) { base.OnUpdate(Dt); //控制器逻辑更新 if (Controller) Controller.OnUpdate(Dt); //移动逻辑更新 MoveLogic(Dt); } //ovverride :: //设置方向 function SetDirection(D) { base.SetDirection(D); AnimationManager.SetDirection(D); // //这里要改变名字和聊天框的朝向 免得反向 // if (D) { // if (AnimationManager.Name) AnimationManager.Name.SetScale(1, 1); // if (AnimationManager.ChatBubble) AnimationManager.ChatBubble.SetScale(1, 1); // } else { // if (AnimationManager.Name) AnimationManager.Name.SetScale(-1, 1); // if (AnimationManager.ChatBubble) AnimationManager.ChatBubble.SetScale(-1, 1); // } } } //通过职业和装备列表来构造一个角色 GameObject.CreateCharacter <- function(Job = 0, EquIdList = [], IsPlayer = false) { //构造角色 local Character = GameObject.Character(); Character.Init(Job); foreach(EquId in EquIdList) { if (EquId > 0) { local EquObj = GameItem.Equipment(EquId); Character.ChangeEquipment(EquObj); } } //如果是玩家开启控制器 if (IsPlayer) Character.OpenControl(); //设置站立模式Ani Character.SetAnimation("RestAni"); return Character; } //通过Cid获取当前地图的角色 GameObject.GetCharacterByCid <- function(cid) { //从全局地图中找到角色 if (GlobalTownManager.CurrentMap) { //遍历所有角色 foreach(obj in GlobalTownManager.CurrentMap.PlayerList) { //角色对象 if (typeof obj == "Game_Character" && obj.Cid == cid) { return obj; } } } }