| 
									
										
										
										
											2024-12-11 15:08:57 +08:00
										 |  |  | /* | 
					
						
							|  |  |  | 文件名:CharacterObjectClass.nut | 
					
						
							|  |  |  | 路径:User/GameClass/ObjectClass/CharacterObjectClass.nut | 
					
						
							|  |  |  | 创建日期:2024-05-11	21:03 | 
					
						
							|  |  |  | 文件用途:角色类 | 
					
						
							|  |  |  | */ | 
					
						
							| 
									
										
										
										
											2024-12-13 20:48:00 +08:00
										 |  |  | class GameObject.Character extends GameObject.ActiveObject { | 
					
						
							| 
									
										
										
										
											2024-12-11 15:08:57 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     hair = null; //头部 | 
					
						
							| 
									
										
										
										
											2024-12-13 20:48:00 +08:00
										 |  |  |     hat = null; //帽子 | 
					
						
							| 
									
										
										
										
											2024-12-11 15:08:57 +08:00
										 |  |  |     face = null; //脸部 | 
					
						
							| 
									
										
										
										
											2024-12-13 20:48:00 +08:00
										 |  |  |     breast = null; //胸部 | 
					
						
							| 
									
										
										
										
											2024-12-11 15:08:57 +08:00
										 |  |  |     coat = null; //上衣 | 
					
						
							|  |  |  |     skin = null; //皮肤 | 
					
						
							| 
									
										
										
										
											2024-12-13 20:48:00 +08:00
										 |  |  |     waist = null; //腰部 | 
					
						
							| 
									
										
										
										
											2024-12-11 15:08:57 +08:00
										 |  |  |     pants = null; //下装 | 
					
						
							|  |  |  |     shoes = null; //鞋子 | 
					
						
							|  |  |  |     weapon = null; //武器 | 
					
						
							| 
									
										
										
										
											2024-12-17 09:41:42 +08:00
										 |  |  |     aurora = null; //光环 | 
					
						
							| 
									
										
										
										
											2024-12-11 15:08:57 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-13 20:48:00 +08:00
										 |  |  |     //动画对象管理器 | 
					
						
							|  |  |  |     AnimationManager = null; | 
					
						
							| 
									
										
										
										
											2024-12-11 15:08:57 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-25 11:33:03 +08:00
										 |  |  |     //传送阵Flag | 
					
						
							|  |  |  |     TransmitFlag = false; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-11 15:08:57 +08:00
										 |  |  |     //属性对象 | 
					
						
							|  |  |  |     Attribute = null; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-18 12:30:47 +08:00
										 |  |  |     //名字 | 
					
						
							|  |  |  |     Name = "无名字"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     //职业编号 | 
					
						
							|  |  |  |     Job = 0; | 
					
						
							| 
									
										
										
										
											2025-01-03 19:47:36 +08:00
										 |  |  |     //cid | 
					
						
							|  |  |  |     Cid = -1; | 
					
						
							| 
									
										
										
										
											2024-12-18 12:30:47 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-25 11:33:03 +08:00
										 |  |  |     //控制器 | 
					
						
							|  |  |  |     Controller = null; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     function _typeof() { | 
					
						
							|  |  |  |         return "character"; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-11 15:08:57 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     function Init(Idx) { | 
					
						
							|  |  |  |         //初始化动画组 | 
					
						
							|  |  |  |         CurrentAni = []; | 
					
						
							| 
									
										
										
										
											2024-12-18 12:30:47 +08:00
										 |  |  |         //设置职业编号 | 
					
						
							|  |  |  |         this.Job = Idx; | 
					
						
							| 
									
										
										
										
											2024-12-14 12:08:20 +08:00
										 |  |  |         //获取角色职业信息 | 
					
						
							| 
									
										
										
										
											2024-12-11 15:08:57 +08:00
										 |  |  |         Info = sq_DeepCopy(AssetManager.CharacterInfoList[Idx]); | 
					
						
							|  |  |  |         base.Init(Info); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-13 20:48:00 +08:00
										 |  |  |         //构造角色动画对象 | 
					
						
							|  |  |  |         AnimationManager = Character_Animation(); | 
					
						
							|  |  |  |         Addchild(AnimationManager); | 
					
						
							|  |  |  |         AnimationManager.Init(); | 
					
						
							| 
									
										
										
										
											2024-12-11 15:08:57 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-15 20:21:17 +08:00
										 |  |  |         foreach(EquId in Info.default_avatar) { | 
					
						
							|  |  |  |             local EquObj = GameItem.Equipment(EquId); | 
					
						
							|  |  |  |             ChangeEquipment(EquObj); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2024-12-11 15:08:57 +08:00
										 |  |  |         //构造属性对象 | 
					
						
							|  |  |  |         // Attribute = AttributeClass(); | 
					
						
							| 
									
										
										
										
											2024-12-25 11:33:03 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-01-05 00:48:35 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     //开启控制 | 
					
						
							|  |  |  |     function OpenControl() { | 
					
						
							| 
									
										
										
										
											2024-12-25 11:33:03 +08:00
										 |  |  |         //分配控制器 | 
					
						
							|  |  |  |         Controller = Object_Controller(this); | 
					
						
							| 
									
										
										
										
											2024-12-11 15:08:57 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     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); | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // function OnUpdate(dt) { | 
					
						
							|  |  |  |     //     //原始逻辑 | 
					
						
							|  |  |  |     //     base.OnUpdate(dt); | 
					
						
							|  |  |  |     // } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     //设置Ani | 
					
						
							|  |  |  |     function SetAnimation(Ani) { | 
					
						
							| 
									
										
										
										
											2024-12-13 20:48:00 +08:00
										 |  |  |         //如果存在动画管理器则设置 | 
					
						
							|  |  |  |         if (AnimationManager) AnimationManager.SetAnimation(Ani); | 
					
						
							| 
									
										
										
										
											2024-12-11 15:08:57 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-13 20:48:00 +08:00
										 |  |  |     //切换装备 | 
					
						
							|  |  |  |     function ChangeEquipment(Equ) { | 
					
						
							|  |  |  |         //如果当前装备槽已经有装备则移除 | 
					
						
							|  |  |  |         if (this[Equ.SlotType]) { | 
					
						
							|  |  |  |             this[Equ.SlotType].OnWearEnd(); | 
					
						
							|  |  |  |             this[Equ.SlotType] = null; | 
					
						
							| 
									
										
										
										
											2024-12-11 15:08:57 +08:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2024-12-13 20:48:00 +08:00
										 |  |  |         //将装备对象赋值给对应装备槽 | 
					
						
							|  |  |  |         this[Equ.SlotType] = Equ; | 
					
						
							|  |  |  |         this[Equ.SlotType].OnWearStart(); | 
					
						
							| 
									
										
										
										
											2024-12-11 15:08:57 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-13 20:48:00 +08:00
										 |  |  |         //如果是武器或者时装则同步动画 | 
					
						
							|  |  |  |         if (Equ.SlotType == "weapon" || Equ.Type == "avatar") { | 
					
						
							|  |  |  |             AnimationManager.Init(Equ.SlotType); | 
					
						
							| 
									
										
										
										
											2024-12-17 09:41:42 +08:00
										 |  |  |         } else if (Equ.Type == "aurora") { | 
					
						
							|  |  |  |             AnimationManager.InitAuroa(); | 
					
						
							| 
									
										
										
										
											2024-12-11 15:08:57 +08:00
										 |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2024-12-13 20:48:00 +08:00
										 |  |  |     //切换装备列表 | 
					
						
							|  |  |  |     function ChangeEquipmentList(EquList) { | 
					
						
							|  |  |  |         foreach(Equ in EquList) { | 
					
						
							|  |  |  |             ChangeEquipment(Equ); | 
					
						
							| 
									
										
										
										
											2024-12-11 15:08:57 +08:00
										 |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2024-12-18 12:30:47 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     //设置名字 | 
					
						
							|  |  |  |     function SetName(Name) { | 
					
						
							|  |  |  |         this.Name = Name; | 
					
						
							|  |  |  |         AnimationManager.SetName(Name); | 
					
						
							|  |  |  |         base.SetName(Name); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2024-12-25 11:33:03 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-01-04 20:03:17 +08:00
										 |  |  |     //是否为客户端玩家 | 
					
						
							|  |  |  |     function IsClientPlayer() { | 
					
						
							|  |  |  |         if (ClientCharacter && this.Cid == ClientCharacter.Cid) | 
					
						
							|  |  |  |             return true; | 
					
						
							|  |  |  |         return false; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2024-12-25 11:33:03 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     //移动速度 | 
					
						
							|  |  |  |     Move_Speed = 500; | 
					
						
							| 
									
										
										
										
											2025-01-04 20:03:17 +08:00
										 |  |  |     //移动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"); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2024-12-25 11:33:03 +08:00
										 |  |  |     //移动逻辑 | 
					
						
							| 
									
										
										
										
											2025-01-04 20:03:17 +08:00
										 |  |  |     function MoveLogic(Dt) { | 
					
						
							| 
									
										
										
										
											2024-12-25 11:33:03 +08:00
										 |  |  |         if (!Parent) return; | 
					
						
							| 
									
										
										
										
											2025-01-04 20:03:17 +08:00
										 |  |  |         //没有移动状态 | 
					
						
							|  |  |  |         if (MoveFlag == DIRECTION.NONE) return; | 
					
						
							| 
									
										
										
										
											2024-12-25 11:33:03 +08:00
										 |  |  |         //在城镇里 | 
					
						
							|  |  |  |         if (typeof Parent == "townmap") { | 
					
						
							| 
									
										
										
										
											2025-01-04 20:03:17 +08:00
										 |  |  |             // 根据 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; | 
					
						
							| 
									
										
										
										
											2024-12-25 11:33:03 +08:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2025-01-04 20:03:17 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |             //设置人物朝向 | 
					
						
							|  |  |  |             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); | 
					
						
							| 
									
										
										
										
											2024-12-25 11:33:03 +08:00
										 |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     //更新 | 
					
						
							|  |  |  |     function OnUpdate(Dt) { | 
					
						
							|  |  |  |         base.OnUpdate(Dt); | 
					
						
							|  |  |  |         //控制器逻辑更新 | 
					
						
							| 
									
										
										
										
											2025-01-05 00:48:35 +08:00
										 |  |  |         if (Controller) Controller.OnUpdate(Dt); | 
					
						
							| 
									
										
										
										
											2025-01-04 20:03:17 +08:00
										 |  |  |         //移动逻辑更新 | 
					
						
							|  |  |  |         MoveLogic(Dt); | 
					
						
							| 
									
										
										
										
											2024-12-25 11:33:03 +08:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2024-12-13 20:48:00 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | //通过职业和装备列表来构造一个角色 | 
					
						
							| 
									
										
										
										
											2025-01-05 00:48:35 +08:00
										 |  |  | GameObject.CreateCharacter <- function(Job = 0, EquIdList = [], IsPlayer = false) { | 
					
						
							| 
									
										
										
										
											2024-12-13 20:48:00 +08:00
										 |  |  |     //构造角色 | 
					
						
							|  |  |  |     local Character = GameObject.Character(); | 
					
						
							|  |  |  |     Character.Init(Job); | 
					
						
							|  |  |  |     foreach(EquId in EquIdList) { | 
					
						
							| 
									
										
										
										
											2024-12-15 20:21:17 +08:00
										 |  |  |         if (EquId > 0) { | 
					
						
							|  |  |  |             local EquObj = GameItem.Equipment(EquId); | 
					
						
							|  |  |  |             Character.ChangeEquipment(EquObj); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2024-12-11 15:08:57 +08:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2025-01-05 00:48:35 +08:00
										 |  |  |     //如果是玩家开启控制器 | 
					
						
							|  |  |  |     if (IsPlayer) Character.OpenControl(); | 
					
						
							|  |  |  |     //设置站立模式Ani | 
					
						
							|  |  |  |     Character.SetAnimation("RestAni"); | 
					
						
							| 
									
										
										
										
											2024-12-13 20:48:00 +08:00
										 |  |  |     return Character; | 
					
						
							| 
									
										
										
										
											2025-01-04 20:03:17 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | //通过Cid获取当前地图的角色 | 
					
						
							|  |  |  | GameObject.GetCharacterByCid <- function(cid) { | 
					
						
							|  |  |  |     //从全局地图中找到城镇并设置角色移动状态 | 
					
						
							|  |  |  |     if (GlobalTownManager.CurrentMap) { | 
					
						
							|  |  |  |         //遍历所有角色 | 
					
						
							|  |  |  |         foreach(obj in GlobalTownManager.CurrentMap.PlayerList) { | 
					
						
							|  |  |  |             //角色对象 | 
					
						
							|  |  |  |             if (typeof obj == "character" && obj.Cid == cid) { | 
					
						
							|  |  |  |                 return obj; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2024-12-11 15:08:57 +08:00
										 |  |  | } |