123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586 |
- using CommonAI.Zone;
- using CommonAI.ZoneClient;
- using CommonLang;
- using CommonLang.Geometry;
- using ET.Client;
- using ET.EventType;
- using ET.Server;
- using Sirenix.Utilities;
- using System;
- using System.IO;
- using System.Linq;
- using XmdsCommon.Message;
- namespace ET
- {
- [FriendOf(typeof(UnitMgr))]
- public partial class BattleMgr : Singleton<BattleMgr>, ISingletonAwake, ISingletonUpdate, ILayerClient
- {
- public ZoneLayer Layer;
- private readonly MemoryStream writeBuffer = new MemoryStream(2048);
- private EventDispatcher<Event> eventHandler;
- private static CommonLang.Geometry.Vector3 vecTemp = new();
- private HashMap<int, BattleUnit> UnitTemplateIdHash = new();
- public void Awake()
- {
- eventHandler = new();
- registerEventHandler();
- Layer = TemplateManager.Factory.CreateClientZoneLayer(BattleResourceMgr.Instance.GameEditorTemplates, this);
- Layer.ActorSyncMode = SyncMode.ForceByServer;
- Layer.LayerInit += LayerEvent_Init;
- Layer.ObjectEnter += LayerEvent_ObjectEnter;
- Layer.ObjectLeave += LayerEvent_ObjectLeave;
- Layer.MessageReceived += (ZoneLayer _, CommonLang.Protocol.IMessage msg) => {
- if (msg is SyncPosEvent || msg is UnitForceSyncPosEvent || msg is LaunchSkill || msg is AddSpellEvent || msg is RemoveObjectEvent || msg is AddUnitEvent || msg is PlayerFocuseTargetEvent || msg is UnitFieldChangedEvent || msg is UnitEffectEvent || msg is UnitLaunchSkillEvent || msg is PlayerSkillStopEvent || msg is UnitHitEvent || msg is UnitLaunchBuffEvent)
- { }
- else
- {
- Log.Debug($"<<<BattleEvent: {msg}");
- }
- eventHandler.Notify(msg as Event);
- };
- Layer.DecorationChanged += (ZoneLayer _, ZoneEditorDecoration ed) => {
- Log.Error("not implements: DecorationChanged");
- };
- }
- public void Update(int timeMS)
- {
-
- Layer.BeginUpdate(timeMS);
- Layer.Update();
- this.doUpdate();
- }
-
-
- void ILayerClient.BattleReady(bool bok)
- {
- Log.Debug($"battle ready......{bok}");
-
- var scnData = Layer.Data;
- if(!scnData.BGM.IsNullOrWhitespace() )
- {
- EventSystem.Instance.Publish<PlayBgm>(PlayBgm.Static.Clone(true, scnData.BGM));
- }
- }
-
-
- public void SendAction(CommonAI.Zone.Action action)
- {
- if(PlayerComponent.Instance == null)
- {
- Log.Error("playerComponent is null");
- return;
- }
- Log.Debug($">>>Send BattleMsg: {action.GetType()}");
- writeBuffer.Position = 0;
- if (BattleResourceMgr.Instance.BattleMsgDecoder.doEncode(writeBuffer, action))
- {
- PlayerComponent.Instance.ClientScene().GetComponent<SessionComponent>().Session.Send(new BattleEventPushToServer() { data = writeBuffer.ToArray() });
- }
- }
-
- public void PostMsg2Layer(CommonLang.Protocol.IMessage msg)
- {
- Layer.ProcessMessage(msg);
- }
-
- protected void LayerEvent_Init(CommonAI.ZoneClient.ZoneLayer layer)
- {
- Log.Debug($"OnLayerInit- scene template ID:{layer.Data.ID}");
- }
-
- protected void LayerEvent_ObjectEnter(ZoneLayer layer, ZoneObject obj)
- {
-
- var unit = BattleUnitFactory.Instance.Create(obj);
- if(unit != null )
- {
- UnitMgr.Instance.PutUnit(obj.ObjectID, unit);
- if (unit is BattleActor)
- {
- UnitMgr.Instance.Actor = unit as BattleActor;
- }
- unit.OnAwake(obj);
- if (unit is BattleUnit bu)
- {
- var tid = (obj as ZoneUnit).TemplateID;
- if (ConstGame.TowerTemplateIDs.Contains(tid))
- {
- if (UnitTemplateIdHash.ContainsKey((tid)))
- {
- Log.Error($"Already exist unit({tid}) @{obj.ObjectID}");
- return;
- }
- UnitTemplateIdHash.Add(tid, bu);
- }
- }
- }
- else
- {
- Log.Error($"unknow object enter:{obj.Name} ID:{obj.ObjectID}");
- }
- }
-
- protected void LayerEvent_ObjectLeave(ZoneLayer layer, ZoneObject obj)
- {
-
- var unit = UnitMgr.Instance.GetUnit(obj.ObjectID);
- if(unit == null)
- {
- Log.Error($"LayerEvent_ObjectLeave not exist:{obj.Name}:{obj.ObjectID}");
- return;
- }
- unit.OnSleep();
- UnitMgr.Instance.RemoveUnit(obj.ObjectID);
- if (unit is BattleUnit bu)
- {
- UnitTemplateIdHash.Remove(bu.ZUnit.TemplateID);
- }
- }
- public BattleUnit GetUnitByTemplateID(int tid)
- {
- return UnitTemplateIdHash.ContainsKey(tid) ? UnitTemplateIdHash[tid] : null;
- }
- private void registerEventHandler()
- {
-
- eventHandler.AddListener<SetAutoBattleB2C>((ev) => {
- var isAutoFight = (ev as SetAutoBattleB2C).isAutoBattle != 0;
- Log.Debug($"AutoFight: {isAutoFight}");
- (UnitMgr.Instance.Actor.ZUnit as ZoneActor).IsGuard = isAutoFight;
- });
- eventHandler.AddListener<PlayerFocuseTargetEvent>((ev) =>
- {
- });
-
- eventHandler.AddListener<ShowTipsEventB2C>((ev) =>
- {
- });
- eventHandler.AddListener<UnitDeadEvent>((ev) =>
- {
- var e = ev as UnitDeadEvent;
- Log.Debug($"Unit({e.object_id}) dead");
- EventSystem.Instance.Publish<PlayAnimatorEvent>(PlayAnimatorEvent.Static.Clone(
- e.ObjectID, AnimatorEventType.Dead));
- var unit = UnitMgr.Instance.GetUnit(e.ObjectID);
- if(unit != null && unit is BattleUnit bunit)
- {
- var launcheffect = bunit.ZUnit.Info.DeadActionEffect;
- if (launcheffect != null)
- {
- EventSystem.Instance.Publish<PlayEffectEvent>(PlayEffectEvent.Static.Clone(launcheffect, unit.Id, CommonLang.Geometry.Vector3.Zero));
- }
- }
-
- });
- eventHandler.AddListener<UnitRebirthEvent>((ev) =>
- {
- });
- eventHandler.AddListener<UnitHitEvent>((ev) =>
- {
- var e = ev as UnitHitEvent;
- var unit = UnitMgr.Instance.GetUnit(e.ObjectID);
- if(unit == null)
- {
- Log.Warning($"Ignore unit({e.ObjectID}) on hit, not exist?");
- return;
- }
- if (e.dmgSrc == CommonAI.Data.DamageSource.RemedyPoison)
- {
-
- e.client_state = (byte)UnitHitEventState.PoisonBuff;
- }
-
- LaunchEffect hitEffect = e.effect;
- if (hitEffect != null)
- {
- float roation = 0f;
- if (hitEffect.IsSyncSenderRotation)
- {
-
- var sender = UnitMgr.Instance.GetUnit(e.senderId);
- if (sender != null)
- {
- Vector3 difpos = new Vector3(unit.ZoneObject.X, unit.ZoneObject.Y, 0) - new Vector3(sender.ZoneObject.X, sender.ZoneObject.Y, 0);
- roation = (float)-Math.Atan2(-difpos.Y, difpos.X);
- }
- }
- if (hitEffect.BindBody)
- {
- vecTemp.Set(0, 0, 0);
- }
- else
- {
- vecTemp.Set(unit.ZoneObject.X, unit.ZoneObject.Y, unit.ZoneObject.Z);
- }
- EventSystem.Instance.Publish<PlayEffectEvent>(PlayEffectEvent.Static.Clone(hitEffect, e.ObjectID, vecTemp, 0, roation));
- }
- });
- eventHandler.AddListener<PlayerPKModeChangeEventB2C>((ev) =>
- {
-
- var e = ev as PlayerPKModeChangeEventB2C;
- Log.Debug($"PKMode: {e.CurMode}");
- });
- eventHandler.AddListener<PlayerBattlePropChangeEventB2C>((ev) =>
- {
- });
- eventHandler.AddListener<PlayerPKValueChangeEventB2C>((ev) =>
- {
- });
- eventHandler.AddListener<BuffActiveSkillEventB2C>((ev) =>
- {
- });
- eventHandler.AddListener<UnitEffectEvent>((ev) =>
- {
- var e = ev as UnitEffectEvent;
- vecTemp.Set(0,0,0);
- var unit = UnitMgr.Instance.GetUnit(e.object_id);
- if (unit != null && !e.effect.BindBody)
- {
- vecTemp.Set(unit.ZoneObject.X, unit.ZoneObject.Y, unit.ZoneObject.Z);
- }
- EventSystem.Instance.Publish(PlayEffectEvent.Static.Clone(e.effect, e.ObjectID, vecTemp));
- });
- eventHandler.AddListener<XmdsUnitPropEventB2C>((ev) =>
- {
- });
-
-
-
-
-
-
-
- eventHandler.AddListener<GameOverEvent>((ev) =>
- {
- var e = ev as GameOverEvent;
- EventSystem.Instance.Publish(GameoverEvent.Static.Clone(e.WinForce));
- });
- eventHandler.AddListener<CameraMoveToEvent>((ev) =>
- {
- var e = ev as CameraMoveToEvent;
- EventSystem.Instance.Publish(CameraEvent.Static.Clone(e.x, e.height, e.y, e.TimeMS, e.MoveSpeedSec));
- });
- eventHandler.AddListener<AddEffectEvent>((ev) => {
- var e = ev as AddEffectEvent;
- if(e.hostId == 0 || UnitMgr.Instance.HasUnit(e.hostId))
- {
- vecTemp.Set(e.x, e.y, 0);
- EventSystem.Instance.Publish(PlayEffectEvent.Static.Clone(e.effect, e.hostId, vecTemp));
- }
- });
- eventHandler.AddListener<ClientMsgEvent>((ev) =>
- {
- var e = ev as ClientMsgEvent;
- Log.Debug($">>>Battle client event: {e.Message}");
- });
-
-
- }
- }
- }
|