Merge pull request 'fix action' (#458) from feature/gfx-action into develop

Reviewed-on: https://git.pthub.vn/Unity/perfect-world-unity/pulls/458
This commit is contained in:
hoangvd
2026-05-20 08:10:42 +00:00
24 changed files with 693 additions and 94 deletions
@@ -1,5 +1,57 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1102 &-6682150482281830067
AnimatorState:
serializedVersion: 6
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: "\u6253\u5750_\u901A\u7528"
m_Speed: 1
m_CycleOffset: 0
m_Transitions: []
m_StateMachineBehaviours: []
m_Position: {x: 50, y: 50, z: 0}
m_IKOnFeet: 0
m_WriteDefaultValues: 1
m_Mirror: 0
m_SpeedParameterActive: 0
m_MirrorParameterActive: 0
m_CycleOffsetParameterActive: 0
m_TimeParameterActive: 0
m_Motion: {fileID: 7400000, guid: 93519909dda6cca42a0c28127afbbb52, type: 2}
m_Tag:
m_SpeedParameter:
m_MirrorParameter:
m_CycleOffsetParameter:
m_TimeParameter:
--- !u!1102 &-4679316952246346250
AnimatorState:
serializedVersion: 6
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: "\u6253\u5750\u5FAA\u73AF_\u901A\u7528"
m_Speed: 1
m_CycleOffset: 0
m_Transitions: []
m_StateMachineBehaviours: []
m_Position: {x: 50, y: 50, z: 0}
m_IKOnFeet: 0
m_WriteDefaultValues: 1
m_Mirror: 0
m_SpeedParameterActive: 0
m_MirrorParameterActive: 0
m_CycleOffsetParameterActive: 0
m_TimeParameterActive: 0
m_Motion: {fileID: 7400000, guid: bf857f5576da777429ed5a6fd606294a, type: 2}
m_Tag:
m_SpeedParameter:
m_MirrorParameter:
m_CycleOffsetParameter:
m_TimeParameter:
--- !u!1107 &-4297166198488271538
AnimatorStateMachine:
serializedVersion: 6
@@ -8,7 +60,13 @@ AnimatorStateMachine:
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: Base Layer
m_ChildStates: []
m_ChildStates:
- serializedVersion: 1
m_State: {fileID: -6682150482281830067}
m_Position: {x: 330, y: 78, z: 0}
- serializedVersion: 1
m_State: {fileID: -4679316952246346250}
m_Position: {x: 348, y: 166, z: 0}
m_ChildStateMachines: []
m_AnyStateTransitions: []
m_EntryTransitions: []
@@ -18,7 +76,7 @@ AnimatorStateMachine:
m_EntryPosition: {x: 50, y: 120, z: 0}
m_ExitPosition: {x: 800, y: 120, z: 0}
m_ParentStateMachinePosition: {x: 800, y: 20, z: 0}
m_DefaultState: {fileID: 0}
m_DefaultState: {fileID: -6682150482281830067}
--- !u!91 &9100000
AnimatorController:
m_ObjectHideFlags: 0
@@ -33,25 +91,25 @@ AnimatorController:
m_DefaultFloat: 0
m_DefaultInt: 0
m_DefaultBool: 0
m_Controller: {fileID: 0}
m_Controller: {fileID: 9100000}
- m_Name: IntParam
m_Type: 3
m_DefaultFloat: 0
m_DefaultInt: 0
m_DefaultBool: 0
m_Controller: {fileID: 0}
m_Controller: {fileID: 9100000}
- m_Name: BoolParam
m_Type: 4
m_DefaultFloat: 0
m_DefaultInt: 0
m_DefaultBool: 0
m_Controller: {fileID: 0}
m_Controller: {fileID: 9100000}
- m_Name: TriggerParam
m_Type: 9
m_DefaultFloat: 0
m_DefaultInt: 0
m_DefaultBool: 0
m_Controller: {fileID: 0}
m_Controller: {fileID: 9100000}
m_AnimatorLayers:
- serializedVersion: 5
m_Name: Base Layer
@@ -0,0 +1,64 @@
/*
* FILE: CECHPWorkSit.cs
*
* DESCRIPTION: Host player sit work
*
* CONVERTED FROM: EC_HPWorkSit.cpp/EC_HPWorkSit.h
*/
using BrewMonster;
using CSNetwork.GPDataType;
namespace BrewMonster.Scripts
{
public class CECHPWorkSit : CECHPWork
{
protected bool m_bBeSitting;
public CECHPWorkSit(CECHPWorkMan pWorkMan) : base(Host_work_ID.WORK_SIT, pWorkMan)
{
m_dwMask = Work_mask.MASK_SIT;
m_dwTransMask = Work_mask.MASK_STAND;
Reset();
}
public void SetBeSittingFlag(bool bTrue)
{
m_bBeSitting = bTrue;
}
public override void Reset()
{
base.Reset();
m_bBeSitting = false;
}
public override bool CopyData(CECHPWork pWork)
{
if (!base.CopyData(pWork))
return false;
CECHPWorkSit pSrc = (CECHPWorkSit)pWork;
m_bBeSitting = pSrc.m_bBeSitting;
return true;
}
protected override void OnFirstTick()
{
m_pHost.m_iMoveMode = (int)Move_Mode.MOVE_STAND;
if (m_bBeSitting)
m_pHost.PlayAction((int)PLAYER_ACTION_TYPE.ACT_SITDOWN_LOOP);
else
{
m_pHost.PlayAction((int)PLAYER_ACTION_TYPE.ACT_SITDOWN);
m_pHost.PlayAction((int)PLAYER_ACTION_TYPE.ACT_SITDOWN_LOOP, true, 200, true);
}
}
public override bool Tick(float dwDeltaTime)
{
base.Tick(dwDeltaTime);
return true;
}
}
}
@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: d9a9c005284728d428a534fcf337a5b1
@@ -649,7 +649,7 @@ namespace BrewMonster.Scripts
//case CECHPWork.Host_work_ID.WORK_FOLLOW: pWork = new CECHPWorkFollow(this); break;
case CECHPWork.Host_work_ID.WORK_FLYOFF: pWork = new CECHPWorkFly(this); break;
case CECHPWork.Host_work_ID.WORK_FREEFALL: pWork = new CECHPWorkFall(this); break;
//case CECHPWork.Host_work_ID.WORK_SIT: pWork = new CECHPWorkSit(this); break;
case CECHPWork.Host_work_ID.WORK_SIT: pWork = new CECHPWorkSit(this); break;
case CECHPWork.Host_work_ID.WORK_PICKUP: pWork = new EC_HPWorkPick(this); break;
case CECHPWork.Host_work_ID.WORK_CONCENTRATE: pWork = new CECHPWorkConcentrate(this); break;
//case CECHPWork.Host_work_ID.WORK_REVIVE: pWork = new CECHPWorkRevive(this); break;
@@ -343,6 +343,15 @@ namespace PerfectWorld.Scripts.Managers
}
return best;
}
/// <summary>Port of CECMatterMan::FindMatterNearHost — nearest pickupable ground matter.</summary>
public CECMatter FindMatterNearHost(float fRadius, bool bPickOnly = true)
{
CECHostPlayer host = CECGameRun.Instance?.GetHostPlayer();
if (host == null)
return null;
return GetNearestPickupableMatter(host.GetPos(), fRadius);
}
public CECMatter CreateMatter(info_matter info)
{
@@ -67,6 +67,7 @@ namespace PerfectWorld.Scripts.Managers
case EC_MsgDef.MSG_PM_PLAYERDOEMOTE:
case EC_MsgDef.MSG_PM_PLAYERGATHER:
case EC_MsgDef.MSG_PM_PLAYERFLY:
case EC_MsgDef.MSG_PM_PLAYERSITDOWN:
case EC_MsgDef.MSG_PM_PLAYERMOUNT:
case EC_MsgDef.MSG_PM_PLAYERCHGSHAPE:
case EC_MsgDef.MSG_PM_PLAYERSKILLRESULT:
@@ -754,6 +755,12 @@ namespace PerfectWorld.Scripts.Managers
cid = (GPDataTypeHelper.FromBytes<cmd_object_landing>((byte[])Msg.dwParam1)).object_id;
break;
case EC_MsgDef.MSG_PM_PLAYERSITDOWN:
if (Convert.ToInt32(Msg.dwParam2) == CommandID.OBJECT_SIT_DOWN)
cid = GPDataTypeHelper.FromBytes<cmd_object_sit_down>((byte[])Msg.dwParam1).id;
else
cid = GPDataTypeHelper.FromBytes<cmd_object_stand_up>((byte[])Msg.dwParam1).id;
break;
case EC_MsgDef.MSG_PM_PLAYERMOUNT:
cid = (GPDataTypeHelper.FromBytes<cmd_player_mounting>((byte[])Msg.dwParam1)).id;
break;
+14 -14
View File
@@ -1544,21 +1544,21 @@ namespace BrewMonster
szAct= $"{action.data.ActionPrefix}_{action.data.action_weapon_suffix[weapon_type].Suffix}";
// CECModel pRightHandWeapon = GetRightHandWeapon();
// if( !bQueue )
// {
// PlayNonSkillActionWithName(iAction, szAct, bRestart, iTransTime);
CECModel pRightHandWeapon = GetRightHandWeapon();
if( !bQueue )
{
m_pActionController. PlayNonSkillActionWithName(iAction, szAct, bRestart, iTransTime);
// if(pRightHandWeapon && IsUsingMagicWeapon())
// pRightHandWeapon->PlayActionByName(_GenWeaponActionName(szAct, m_iGender), 1.0f, bRestart, iTransTime, true, iAction);
// }
// else
// {
// QueueNonSkillActionWithName(iAction, szAct, iTransTime, bRestart, false, false, true, NULL, COMACT_FLAG_MODE_ONCE_MULTIIGNOREGFX);
// if(pRightHandWeapon && IsUsingMagicWeapon())
// pRightHandWeapon->PlayActionByName(_GenWeaponActionName(szAct, m_iGender), 1.0f, bRestart, iTransTime, true, iAction);
}
else
{
m_pActionController. QueueNonSkillActionWithName(iAction, szAct, iTransTime, bRestart, false, false, true, null, COMACT_FLAG_MODE_ONCE_MULTIIGNOREGFX);
// if(pRightHandWeapon && IsUsingMagicWeapon())
// pRightHandWeapon->QueueAction(_GenWeaponActionName(szAct, m_iGender), iTransTime, iAction, bRestart ? true : false);
// }
// if(pRightHandWeapon && IsUsingMagicWeapon())
// pRightHandWeapon->QueueAction(_GenWeaponActionName(szAct, m_iGender), iTransTime, iAction, bRestart ? true : false);
}
if (m_iBuddyId != 0)
{
@@ -1619,7 +1619,7 @@ namespace BrewMonster
// UpdateWeaponHangerPosByAction(iAction);
// }
// EventBus.PublishChannel(m_PlayerInfo.cid, new PlayActionEvent(szShapeName, szAct, iTransTime));
m_pActionController.PlayNonSkillActionWithName(iAction, szAct, bRestart, iTransTime);
// m_pActionController.PlayNonSkillActionWithName(iAction, szAct, bRestart, iTransTime);
return true;
}
else
@@ -314,6 +314,21 @@ namespace CSNetwork.C2SCommand
public int id_task; // Task ID
}
public struct cmd_assist_sel
{
public int idTeamMember;
}
public struct cmd_bind_player_request
{
public int target;
}
public struct cmd_bind_player_invite
{
public int target;
}
public struct cmd_error_msg
{
public int iMessage;
@@ -1045,6 +1045,21 @@ namespace CSNetwork.C2SCommand
return SerializeCommand(CommandID.ACTIVE_RUSH_FLY, pCmd);
}
public static Octets CreateTeamAssistSelCommand(int idTeamMember)
{
return SerializeCommand(CommandID.ASSIST_SELECT, new cmd_assist_sel { idTeamMember = idTeamMember });
}
public static Octets CreateBindPlayerRequestCommand(int idTarget)
{
return SerializeCommand(CommandID.BIND_PLAYER_REQUEST, new cmd_bind_player_request { target = idTarget });
}
public static Octets CreateBindPlayerInviteCommand(int idTarget)
{
return SerializeCommand(CommandID.BIND_PLAYER_INVITE, new cmd_bind_player_invite { target = idTarget });
}
public static Octets CreatePetCtrlCmd(int idTarget, int cmd, byte[] pParamBuf, int iParamLen)
{
cmd_pet_ctrl pCmd = new cmd_pet_ctrl();
@@ -2830,6 +2830,18 @@ namespace CSNetwork.GPDataType
public int object_id;
};
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct cmd_object_sit_down
{
public int id;
};
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct cmd_object_stand_up
{
public int id;
};
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct cmd_host_rush_fly
{
@@ -1572,6 +1572,11 @@ namespace CSNetwork
break;
}
case CommandID.OBJECT_SIT_DOWN:
case CommandID.OBJECT_STAND_UP:
EC_ManMessage.PostMessage(EC_MsgDef.MSG_PM_PLAYERSITDOWN, MANAGER_INDEX.MAN_PLAYER, -1, pDataBuf, pCmdHeader);
break;
default:
#if UNITY_EDITOR
if (isDebug)
@@ -2962,6 +2967,54 @@ namespace CSNetwork
SendProtocol(gamedatasend);
}
public void c2s_SendCmdSitDown()
{
var g = new gamedatasend();
g.Data = C2SCommandFactory.CreateNakeCmd(C2SCommand.CommandID.SIT_DOWN);
SendProtocol(g);
}
public void c2s_SendCmdTeamAssistSel(int idTeamMember)
{
var g = new gamedatasend();
g.Data = C2SCommandFactory.CreateTeamAssistSelCommand(idTeamMember);
SendProtocol(g);
}
public void c2s_SendCmdOpenBoothTest()
{
var g = new gamedatasend();
g.Data = C2SCommandFactory.CreateNakeCmd(C2SCommand.CommandID.OPEN_BOOTH_TEST);
SendProtocol(g);
}
public void c2s_SendCmdBindPlayerRequest(int idTarget)
{
var g = new gamedatasend();
g.Data = C2SCommandFactory.CreateBindPlayerRequestCommand(idTarget);
SendProtocol(g);
}
public void c2s_SendCmdBindPlayerInvite(int idTarget)
{
var g = new gamedatasend();
g.Data = C2SCommandFactory.CreateBindPlayerInviteCommand(idTarget);
SendProtocol(g);
}
/// <summary>Port of CECGameSession::trade_Start.</summary>
public bool trade_Start(int idTarget)
{
var p = new tradestart
{
Roleid = m_iCharID,
Partner_roleid = idTarget,
Localsid = (int)_localsid
};
SendProtocol(p);
return true;
}
public void c2s_SendCmdPetCtrl(int idTarget, int cmd, byte[] pParamBuf, int iParamLen)
{
gamedatasend gamedatasend = new gamedatasend();
@@ -655,6 +655,42 @@ namespace BrewMonster.Network
{
Instance._gameSession.c2s_SendCmdStandUp();
}
public static void c2s_CmdSitDown()
{
BMLogger.LogError("HoangDev: c2s_CmdSitDown");
Instance._gameSession.c2s_SendCmdSitDown();
}
public static void c2s_CmdTeamAssistSel(int idTeamMember)
{
Instance._gameSession.c2s_SendCmdTeamAssistSel(idTeamMember);
}
public static void c2s_CmdActiveRushFly(bool bActive)
{
Instance._gameSession.c2s_SendCmdActiveRushFly(bActive);
}
public static void c2s_CmdOpenBoothTest()
{
Instance._gameSession.c2s_SendCmdOpenBoothTest();
}
public static void c2s_CmdBindPlayerRequest(int idTarget)
{
Instance._gameSession.c2s_SendCmdBindPlayerRequest(idTarget);
}
public static void c2s_CmdBindPlayerInvite(int idTarget)
{
Instance._gameSession.c2s_SendCmdBindPlayerInvite(idTarget);
}
public static bool trade_Start(int idTarget)
{
return Instance._gameSession.trade_Start(idTarget);
}
#region Task
public static void c2s_CmdGetAllData(bool byPack, bool byEquip, bool byTask)
{
@@ -666,6 +702,11 @@ namespace BrewMonster.Network
{
Instance._gameSession.c2s_SendCmdEmoteAction(wPose);
}
public static void c2s_CmdSessionEmote(int iPose)
{
Instance._gameSession.c2s_SendCmdEmoteAction((uint)iPose);
}
public static void c2s_CmdTaskNotify( byte[] pBuf, uint sz)
{
if (Instance != null && Instance._gameSession != null)
@@ -17,6 +17,7 @@ using BrewMonster.Assets.PerfectWorld.Scripts.Skills;
using BrewMonster.Network;
using BrewMonster.Scripts;
using BrewMonster.Scripts.Skills;
using static BrewMonster.Scripts.FixedMsg;
using CSNetwork.C2SCommand;
using CSNetwork.GPDataType;
using CSNetwork.S2CCommand;
@@ -513,7 +514,7 @@ namespace BrewMonster
data.AddRange(BitConverter.GetBytes((int)cmdSC.GetParam()));
break;
}
case CECShortcut.ShortcutType.SCT_SKILL:
{
CECSCSkill skillSC = (CECSCSkill)pSC;
@@ -949,61 +950,61 @@ namespace BrewMonster
public override bool Execute()
{
CECHostPlayer pHost = CECGameRun.Instance.GetHostPlayer();
if (!pHost || !pHost.IsAllResReady())
if (pHost == null || !pHost.IsAllResReady())
return false;
// if (GetCoolTime(0)>0)
// {
// bool bForbidCmd = true;
// if (m_iCommand == CMD_RUSHFLY && pHost.GetRushFlyFlag())
// bForbidCmd = false;
//
// if (bForbidCmd)
// {
// g_pGame.GetGameRun().AddFixedMessage(FIXMSG_CMD_INCOOLTIME);
// return false;
// }
// }
switch (m_iCommand)
int iMax = 0;
if (GetCoolTime(ref iMax) > 0)
{
// case CMD_SITDOWN: pHost.CmdSitDown(!pHost.IsSitting()); break;
// case CMD_WALKRUN: pHost.CmdWalkRun(!pHost.GetWalkRunFlag()); break;
bool bForbidCmd = true;
if ((CommandID)m_iCommand == CMD_RUSHFLY && pHost.GetRushFlyFlag())
bForbidCmd = false;
if (bForbidCmd)
{
CECGameRun.Instance?.AddFixedMessage((int)FIXMSG_CMD_INCOOLTIME);
return false;
}
}
BMLogger.LogError("HoangDev: (CommandID)m_iCommand:"+(CommandID)m_iCommand);
switch ((CommandID)m_iCommand)
{
case CMD_SITDOWN: pHost.CmdSitDown(!pHost.IsSitting()); break;
case CMD_WALKRUN: pHost.CmdWalkRun(!pHost.GetWalkRunFlag()); break;
// case CMD_NORMALATTACK: pHost.CmdNormalAttack(); break;
// case CMD_FINDTARGET: pHost.CmdFindTarget(); break;
// case CMD_ASSISTATTACK: pHost.CmdAssistAttack(); break;
// case CMD_INVITETOTEAM: pHost.CmdInviteToTeam(); break;
// case CMD_LEAVETEAM: pHost.CmdLeaveTeam(); break;
// case CMD_KICKTEAMMEM: pHost.CmdKickTeamMember(); break;
// case CMD_FINDTEAM: pHost.CmdFindTeam(); break;
// case CMD_STARTTRADE: pHost.CmdStartTrade(); break;
// case CMD_SELLBOOTH: pHost.CmdSellBooth(); break;
// case CMD_BUYBOOTH: pHost.CmdBuyBooth(); break;
case (int)CommandID.CMD_PLAYPOSE: pHost.CmdStartPose((int)m_dwParam); break;
// case CMD_INVITETOFACTION: pHost.CmdInviteToFaction(); break;
case (int)CommandID.CMD_FLY:
case CMD_FINDTARGET: pHost.CmdFindTarget(); break;
case CMD_ASSISTATTACK: pHost.CmdAssistAttack(); break;
case CMD_INVITETOTEAM: pHost.CmdInviteToTeam(); break;
case CMD_LEAVETEAM: pHost.CmdLeaveTeam(); break;
case CMD_KICKTEAMMEM: pHost.CmdKickTeamMember(); break;
case CMD_FINDTEAM: pHost.CmdFindTeam(); break;
case CMD_STARTTRADE: pHost.CmdStartTrade(); break;
case CMD_SELLBOOTH: pHost.CmdSellBooth(); break;
case CMD_BUYBOOTH: pHost.CmdBuyBooth(); break;
case CMD_PLAYPOSE: pHost.CmdStartPose((int)m_dwParam); break;
case CMD_INVITETOFACTION: pHost.CmdInviteToFaction(); break;
case CMD_FLY:
{
// 如果骑乘要飞行,则这些 action switcher,否则 CmdFly
// If riding wants to fly, then these action switcher, otherwise CmdFly
// Call CmdFly(true) to match F4 key behavior
// Manual fly toggle should also cancel any active auto-route/AutoPF move.
// Use same behavior as local input (F4) so the player regains control immediately.
var wm = pHost.GetWorkMan();
if (wm != null)
// If riding wants to fly, use action switcher; otherwise CmdFly
if (pHost.GetActionSwitcher()?.OnRideToFlyAction() != true)
{
var mw = wm.GetRunningWork(CECHPWork.Host_work_ID.WORK_MOVETOPOS) as CECHPWorkMove;
if (mw != null && mw.GetAutoMove())
var wm = pHost.GetWorkMan();
if (wm != null)
{
wm.FinishRunningWork(CECHPWork.Host_work_ID.WORK_MOVETOPOS);
var mw = wm.GetRunningWork(CECHPWork.Host_work_ID.WORK_MOVETOPOS) as CECHPWorkMove;
if (mw != null && mw.GetAutoMove())
wm.FinishRunningWork(CECHPWork.Host_work_ID.WORK_MOVETOPOS);
}
CECIntelligentRoute.Instance().ResetSearch();
pHost.CmdFly(true);
}
CECIntelligentRoute.Instance().ResetSearch();
pHost.CmdFly(true);
break;
}
// case CMD_PICKUP: pHost.CmdPickup(); break;
// case CMD_GATHER: pHost.CmdGather(); break;
// case CMD_RUSHFLY: pHost.CmdRushFly(); break;
// case CMD_BINDBUDDY: pHost.CmdBindBuddy(pHost.GetSelectedTarget()); break;
case CMD_GATHER: pHost.CmdGather(); break;
case CMD_RUSHFLY: pHost.CmdRushFly(); break;
case CMD_BINDBUDDY: pHost.CmdBindBuddy(pHost.GetSelectedTarget()); break;
default:
return false;
}
@@ -1079,37 +1080,34 @@ namespace BrewMonster
return szIconFile;
}
// Get item cool time
int GetCoolTime(ref int piMax/* NULL */)
public override int GetCoolTime(ref int piMax)
{
CECHostPlayer pHost = CECGameRun.Instance.GetHostPlayer();
int iTime = 0;
piMax = 0;
if (pHost == null)
return 0;
switch ((CommandID)m_iCommand)
{
case CommandID.CMD_RUSHFLY:
// iTime = pHost.GetCoolTime(GP_CT_FLY_RUSH, piMax);
case CMD_RUSHFLY:
iTime = pHost.GetCoolTime((int)CoolTimeIndex.GP_CT_FLY_RUSH, out piMax);
break;
case CommandID.CMD_PLAYPOSE:
// todo need to get cooldown here
// iTime = pHost.GetCoolTime(GP_CT_EMOTE, piMax);
case CMD_PLAYPOSE:
iTime = pHost.GetCoolTime((int)CoolTimeIndex.GP_CT_EMOTE, out piMax);
break;
case CommandID.CMD_BINDBUDDY:
case CMD_BINDBUDDY:
{
// CECCounter& cnt = pHost.GetBindCmdCoolCnt();
// iTime = cnt.GetPeriod() - cnt.GetCounter();
//
// if (piMax)
// *piMax = cnt.GetPeriod();
CECCounter cnt = pHost.GetBindCmdCoolCnt();
iTime = (int)(cnt.GetPeriod() - cnt.GetCounter());
piMax = (int)cnt.GetPeriod();
break;
}
default:
// if (piMax) *piMax = 0;
piMax = 0;
break;
}
@@ -206,6 +206,9 @@ namespace BrewMonster.Assets.PerfectWorld.Scripts.Players
public void SetPostMessageFlag(bool bCan) { m_bCanAddMsg = bCan; }
public virtual bool OnFlyToRideAction(int petIndex) { return false; } // fly -> ride
/// <summary>Ride mount then fly (shortcut CMD_FLY). 骑乘后飞行</summary>
public virtual bool OnRideToFlyAction() { return false; }
}
public enum EMsgActionSwitcher
@@ -497,6 +497,7 @@ namespace BrewMonster
switch (Msg.dwMsg)
{
case EC_MsgDef.MSG_PM_PLAYERFLY: OnMsgPlayerFly(Msg); break;
case EC_MsgDef.MSG_PM_PLAYERSITDOWN: OnMsgPlayerSitDown(Msg); break;
case EC_MsgDef.MSG_PM_PLAYERBASEINFO: OnMsgPlayerBaseInfo(Msg); break;
case EC_MsgDef.MSG_PM_PLAYEREXTSTATE: OnMsgPlayerExtState(Msg); break;
case EC_MsgDef.MSG_PM_PLAYEREQUIPDATA: OnMsgPlayerEquipData(Msg); break;
@@ -1202,6 +1203,22 @@ namespace BrewMonster
m_dwStates |= (uint)PlayerNPCState.GP_STATE_FLY;
}
void OnMsgPlayerSitDown(ECMSG Msg)
{
if (Convert.ToInt32(Msg.dwParam2) == CommandID.OBJECT_SIT_DOWN)
{
m_dwStates |= (uint)PlayerNPCState.GP_STATE_SITDOWN;
m_pEPWorkMan.StartNormalWork(new CECEPWorkIdle(m_pEPWorkMan, CECEPWork.Idle_work_type.IDLE_SITDOWN, 0, 0));
}
else // OBJECT_STAND_UP
{
m_dwStates &= ~(uint)PlayerNPCState.GP_STATE_SITDOWN;
if (m_pEPWorkMan.IsWorkRunning(CECEPWork.EP_work_ID.WORK_IDLE))
PlayAction((int)PLAYER_ACTION_TYPE.ACT_STANDUP);
m_pEPWorkMan.FinishIdleWork(CECEPWork.Idle_work_type.IDLE_SITDOWN);
}
}
// Load player equipments
bool LoadPlayerEquipments()
{
@@ -260,8 +260,6 @@ namespace BrewMonster
enumSkillLearnedState learnedState = model.GetSkillLearnedState(m_skillID);
int requiredItem = model.GetRequiredBook(m_skillID, m_curLevel + 1);
if(m_skillID == 1)
BMLogger.LogError($"UpdateUpgradeBtn learnedState:{learnedState}, fitLevel={fitLevel}, requiredItem:{requiredItem}, model.CheckPreItem(requiredItem):{model.CheckPreItem(requiredItem)}");
if (enumSkillLearnedState.SKILL_FULL != learnedState &&
enumSkillFitLevelState.SKILL_FIT_LEVEL == fitLevel &&
(requiredItem == 0 || model.CheckPreItem(requiredItem)))
+8 -8
View File
@@ -1,18 +1,18 @@
{
"items": [
{
"header": 1992,
"param": 0,
"hasParam": false,
"describe": "Buff rage",
"lastUsedUtcTicks": 639138321717437357
},
{
"header": 8903,
"param": 73125,
"hasParam": true,
"describe": "NoCooldown",
"lastUsedUtcTicks": 639138321659072960
"lastUsedUtcTicks": 639147565037094641
},
{
"header": 1992,
"param": 0,
"hasParam": false,
"describe": "Buff rage",
"lastUsedUtcTicks": 639147564992569650
},
{
"header": 2000,
+259
View File
@@ -0,0 +1,259 @@
using BrewMonster.Managers;
using BrewMonster.Network;
using BrewMonster.Scripts;
using BrewMonster.UI;
using CSNetwork.GPDataType;
using PerfectWorld.Scripts.Managers;
using UnityEngine;
using static BrewMonster.Scripts.CECHPWork;
using static BrewMonster.CECHPWorkTrace;
namespace BrewMonster
{
public partial class CECHostPlayer
{
public bool GetWalkRunFlag() => m_bWalkRun;
public bool GetRushFlyFlag() => m_bRushFly;
CECCounter m_BindCmdCoolCnt = new CECCounter();
public CECCounter GetBindCmdCoolCnt() => m_BindCmdCoolCnt;
void InitBindCmdCoolCnt()
{
m_BindCmdCoolCnt.SetPeriod(35000);
m_BindCmdCoolCnt.Reset(true);
}
// Sit down / Stand up
// 坐下 / 站起
public bool CmdSitDown(bool bSitDown)
{
BMLogger.LogError("HoangDev: CmdSitDown:"+bSitDown);
if (!CanDo(ActionCanDo.CANDO_SITDOWN))
return false;
if (bSitDown)
UnityGameSession.c2s_CmdSitDown();
else
UnityGameSession.c2s_CmdStandUp();
return true;
}
// Switch walk and run state
// 切换走/跑状态
public bool CmdWalkRun(bool bRun)
{
m_bWalkRun = bRun;
return true;
}
// Find a near target (stub)
// 寻找附近目标(占位)
public bool CmdFindTarget()
{
return true;
}
// Select other player's attacked target
// 选择队友正在攻击的目标
public bool CmdAssistAttack()
{
if (m_pWorkMan.IsSitting())
{
UnityGameSession.c2s_CmdStandUp();
return false;
}
if (CanDo(ActionCanDo.CANDO_ASSISTSEL))
UnityGameSession.c2s_CmdTeamAssistSel(m_idSelTarget);
return true;
}
// Invite selected player to join team
// 邀请选中的玩家入队
public bool CmdInviteToTeam()
{
if (IsDead() || !GPDataTypeHelper.ISPLAYERID(m_idSelTarget) || m_idSelTarget == GetCharacterID())
return false;
UnityGameSession.c2s_CmdTeamInvite(m_idSelTarget);
return true;
}
// Leave current team (confirmation dialog)
// 离开当前队伍(确认框)
public bool CmdLeaveTeam()
{
if (IsDead() || m_pTeam == null)
return false;
string szMsg = CECUIManager.Instance?.GetInGameUIMan()?.GetStringFromTable(235)
?? "Are you sure you want to leave the team?";
CECUIManager.Instance?.ShowMessageBoxYesAndNo("", szMsg, null,
() => UnityGameSession.c2s_CmdTeamLeaveParty(), null);
return true;
}
// Kick one member of team (stub)
// 踢出队员(占位)
public bool CmdKickTeamMember()
{
return true;
}
// Search for a team (stub)
// 寻找队伍(占位)
public bool CmdFindTeam()
{
return true;
}
// Start trade with other selected player
// 与选中玩家开始交易
public bool CmdStartTrade()
{
if (m_pWorkMan.IsSitting())
{
UnityGameSession.c2s_CmdStandUp();
return false;
}
if (!CanDo(ActionCanDo.CANDO_TRADE))
return false;
if (!GPDataTypeHelper.ISPLAYERID(m_idSelTarget) || m_idSelTarget == m_PlayerInfo.cid)
return false;
UnityGameSession.trade_Start(m_idSelTarget);
return true;
}
// Open booth for selling items
// 开摊出售
public bool CmdSellBooth()
{
if (IsInvisible())
{
CECGameRun.Instance?.AddFixedMessage((int)FixedMsg.FIXMSG_CANNOT_USE_WHEN_INVISIBLE);
return false;
}
if (m_pWorkMan.IsSitting())
{
UnityGameSession.c2s_CmdStandUp();
return false;
}
if (m_pWorkMan.IsFollowing())
m_pWorkMan.FinishAllWork(true);
if (!CanDo(ActionCanDo.CANDO_BOOTH))
return false;
UnityGameSession.c2s_CmdOpenBoothTest();
return true;
}
// Open booth for buying items (stub)
// 开摊收购(占位)
public bool CmdBuyBooth()
{
return true;
}
// Invite selected player to join faction (stub)
// 邀请入帮(占位)
public bool CmdInviteToFaction()
{
return true;
}
/*public bool CmdPickup()
{
if (m_pWorkMan.IsSitting())
{
UnityGameSession.c2s_CmdStandUp();
return false;
}
if (!CanDo(ActionCanDo.CANDO_PICKUP))
return false;
CECHPWork pWork = m_pWorkMan.GetWork(Host_work_ID.WORK_TRACEOBJECT);
if (pWork is CECHPWorkTrace pTrace &&
pTrace.GetTraceReason() == Trace_reason.TRACE_PICKUP)
return true;
EC_ManMatter matterMan = EC_ManMessageMono.Instance?.EC_ManMatter;
CECMatter pMatter = matterMan?.FindMatterNearHost(10.0f, true);
if (pMatter != null)
PickupObject(pMatter.GetMatterID(), false);
return true;
}*/
public bool CmdGather()
{
if (m_pWorkMan.IsSitting())
{
UnityGameSession.c2s_CmdStandUp();
return false;
}
if (!CanDo(ActionCanDo.CANDO_GATHER))
return false;
CECHPWork pWork = m_pWorkMan.GetWork(Host_work_ID.WORK_TRACEOBJECT);
if (pWork is CECHPWorkTrace pTrace &&
pTrace.GetTraceReason() == Trace_reason.TRACE_GATHER)
return true;
PickupObject(m_idSelTarget, true);
return true;
}
public bool CmdRushFly()
{
if (m_bAboutToDie || IsDead() || !IsFlying())
return false;
UnityGameSession.c2s_CmdActiveRushFly(!m_bRushFly);
return true;
}
public bool CmdBindBuddy(int idTarget)
{
if (!m_BindCmdCoolCnt.IsFull())
{
CECGameRun.Instance?.AddFixedMessage((int)FixedMsg.FIXMSG_CMD_INCOOLTIME);
return false;
}
if (!CanDo(ActionCanDo.CANDO_BINDBUDDY) || !GPDataTypeHelper.ISPLAYERID(idTarget) ||
idTarget == GetCharacterID())
return false;
EC_ElsePlayer pPlayer = m_pPlayerMan?.GetElsePlayer(idTarget);
if (pPlayer == null || pPlayer.GetGender() == GetGender())
return false;
A3DVECTOR3 vDist = pPlayer.GetServerPos() - GetPos();
if (vDist.Magnitude() >= 2.8f)
{
CECGameRun.Instance?.AddFixedMessage((int)FixedMsg.FIXMSG_TARGETISFAR);
return false;
}
if (GetGender() == GENDER.GENDER_MALE)
UnityGameSession.c2s_CmdBindPlayerInvite(idTarget);
else
UnityGameSession.c2s_CmdBindPlayerRequest(idTarget);
m_BindCmdCoolCnt.Reset();
return true;
}
}
}
@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 61bcfdcbd8ffcd746b0e59990cc6970b
@@ -135,6 +135,7 @@ namespace BrewMonster
int iAction = (int)PLAYER_ACTION_TYPE.ACT_STAND;
bool bSession = false;
BMLogger.LogError("HoangDev: idEmote "+idEmote);
// Select action according to pose
switch (idEmote)
{
+38
View File
@@ -0,0 +1,38 @@
using System;
using BrewMonster.Network;
using BrewMonster.Scripts;
using BrewMonster.Scripts.Task;
using CSNetwork;
using CSNetwork.GPDataType;
namespace BrewMonster
{
public partial class CECHostPlayer
{
private void OnMsgPlayerSitDown(ECMSG Msg)
{
if (Convert.ToInt32(Msg.dwParam2) == CommandID.OBJECT_SIT_DOWN)
{
if (m_pWorkMan.IsMovingToPosition() ||
m_pWorkMan.IsTracing() ||
m_pWorkMan.IsFollowing())
{
m_MoveCtrl.SendStopMoveCmd(EC_Utility.ToVector3(GetPos()), GetGroundSpeed(), (int)GPMoveMode.GP_MOVE_RUN);
}
m_dwStates |= (uint)PlayerNPCState.GP_STATE_SITDOWN;
CECHPWorkSit pWork = (CECHPWorkSit)m_pWorkMan.CreateWork(CECHPWork.Host_work_ID.WORK_SIT);
pWork.SetBeSittingFlag(false);
m_pWorkMan.StartWork_p1(pWork);
GetTaskInterface().SetEmotion((int)TaskInterface.CommandTaskAction.CMD_EMOTION_SITDOWN);
}
else if (Convert.ToInt32(Msg.dwParam2) == CommandID.OBJECT_STAND_UP)
{
m_dwStates &= ~(uint)PlayerNPCState.GP_STATE_SITDOWN;
CECHPWorkStand pWork = (CECHPWorkStand)m_pWorkMan.CreateWork(CECHPWork.Host_work_ID.WORK_STAND);
m_pWorkMan.StartWork_p1(pWork);
}
}
}
}
+2
View File
@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 3b8afadf7e5c78f409d4e8746ef6ea77
+7 -3
View File
@@ -565,6 +565,7 @@ namespace BrewMonster
case EC_MsgDef.MSG_HST_COOLTIMEDATA: OnMsgHstCoolTimeData(Msg); break;
case EC_MsgDef.MSG_HST_PRESSCANCEL: OnMsgHstPressCancel(Msg); break;
case EC_MsgDef.MSG_PM_PLAYERFLY: OnMsgPlayerFly(Msg); break;
case EC_MsgDef.MSG_PM_PLAYERSITDOWN: OnMsgPlayerSitDown(Msg); break;
case EC_MsgDef.MSG_HST_PETOPT: OnMsgHstPetOpt(Msg); break;
case EC_MsgDef.MSG_HST_SETPLAYERLIMIT: OnMsgHstSetPlayerLimit(Msg); break;
case EC_MsgDef.MSG_PM_PLAYERMOUNT: OnMsgPlayerMount(Msg); break;
@@ -1327,6 +1328,7 @@ namespace BrewMonster
m_IncantCnt = new CECCounter();
m_IncantCnt.SetPeriod(1000);
m_IncantCnt.Reset(true);
InitBindCmdCoolCnt();
m_bEnterGame = false;
}
@@ -3374,7 +3376,8 @@ namespace BrewMonster
if (iPose == (int)RoleExpression.ROLEEXP_SITDOWN)
{
// UnityGameSession.c2s_CmdSessionEmote(iPose);
BMLogger.LogError("HoangDev: c2s_CmdSessionEmote: "+iPose);
UnityGameSession.c2s_CmdSessionEmote(iPose);
}
else if (iPose == (int)RoleExpression.ROLEEXP_KISS)
{
@@ -3655,9 +3658,10 @@ namespace BrewMonster
m_PetOptCnt.IncCounter(iRealTime);
// Bind command cool counter
/* if (m_BindCmdCoolCnt.IncCounter(dwDeltaTime))
m_BindCmdCoolCnt.Reset(true);
if (m_BindCmdCoolCnt.IncCounter(iRealTime))
m_BindCmdCoolCnt.Reset(true);
/*
// Auto fashion time counter
if (m_bAutoFashion && GetBoothState() != 2 && !IsShapeChanged())
{
+1
View File
@@ -221,6 +221,7 @@ namespace BrewMonster
{
return;
}
BMLogger.LogError("HoangDev animationName:"+animationName);
bool isState = namedAnimancer.States.TryGet(animationName, out var existingState) ? true : false;
if (isState)
{