DOF/sqr/User/Object/ActiveObject/CharacterObjectClass.nut

380 lines
11 KiB
Plaintext

/*
文件名: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;
}
}
}
}