using vnxbqy.UI; using System; using System.Collections; using System.Collections.Generic; using LitJson; /// /// 合服-转盘 /// public class MergeServerTurntableModel : ILModel { public ILOpenServerActivityProxy activity; public Operation operationType = Operation.default9; public const int activityID = 2; public const int activityType = (int)OpenServerActivityCenter.ActivityType.AT_HFHD; public event Action PlayerTurntableEvent; public int[] jpPosition; //展示极品位置 public int[] zjPosition; public int turntableCount; public int ctgTotal; public int useMoneyTotal; public int turnItemState; //转盘物品已抽中记录,按转盘物品编号二进制位代表是否已抽中 public int getItemNum; //本次抽中的物品编号,非转盘结果时为0,大于0时为通知本次转到的物品编号 public const int itemCount = 12; public int runIndex = 0; //转圈的位置,已经获得的物品不再转 itemSort的索引 public int runState = 0; //0未开始 1起步转(加速) 2结束转(减速) //客户端排序对应下发的物品索引turnItemList //物品库类型;1-常规,2-极品,3-终极 //-1 为未分配 -2为空 public List itemSort = new List(); public bool IsOpen() { return OperationTimeHepler.Instance.SatisfyOpenCondition(operationType); } public bool IsAdvance() { return false; } public bool priorityOpen() { //红点 return redpoint.state == RedPointState.Simple; } public event Action onStateUpdate; public event Action OnOperationTimeUpdateEvent; //为了保证执行顺序 protected override void Init() { OperationTimeHepler.Instance.operationStartEvent += OperationStartEvent; OperationTimeHepler.Instance.operationEndEvent += OperationEndEvent; OperationTimeHepler.Instance.dayResetEvent += DayResetEvent; GameEvent.beforePlayerDataInitializeEvent += OnBeforePlayerDataInitialize; GameEvent.playerLoginOkEvent += OnPlayerLoginOk; ILOperationTimeHepler.Instance.operationTimeUpdateEvent += operationTimeUpdateEvent; activity = new ILOpenServerActivityProxy(IsOpen, IsAdvance, priorityOpen); OpenServerActivityCenter.Instance.Register(activityID, activity, activityType); ParseConfig(); } void ParseConfig() { var config = FuncConfigConfig.Get("HFTurntable"); jpPosition = JsonMapper.ToObject(config.Numerical1); zjPosition = JsonMapper.ToObject(config.Numerical2); } public void OnBeforePlayerDataInitialize() { turntableCount = 0; ctgTotal = 0; useMoneyTotal = 0; turnItemState = 0; getItemNum = 0; itemSort.Clear(); } public void OnPlayerLoginOk() { UpdateRedpoint(); } protected override void UnInit() { OperationTimeHepler.Instance.operationStartEvent -= OperationStartEvent; OperationTimeHepler.Instance.operationEndEvent -= OperationEndEvent; OperationTimeHepler.Instance.dayResetEvent -= DayResetEvent; GameEvent.beforePlayerDataInitializeEvent -= OnBeforePlayerDataInitialize; GameEvent.playerLoginOkEvent -= OnPlayerLoginOk; ILOperationTimeHepler.Instance.operationTimeUpdateEvent -= operationTimeUpdateEvent; } private void operationTimeUpdateEvent(Operation type) { if (type == operationType) { OperationBase operationBase; if (!OperationTimeHepler.Instance.TryGetOperationTime(operationType, out operationBase)) { return; } OperationTurntable operation = operationBase as OperationTurntable; //-1 为未分配 -2为空 itemSort.Clear(); for (int i = 0; i < itemCount; i++) { itemSort.Add(-1); } //物品库类型;1-常规,2-极品,3-终极 for (int i = 0; i < jpPosition.Length; i++) { if (operation.itemTypeIndexs.ContainsKey(2)) { if (i < operation.itemTypeIndexs[2].Count) { itemSort[jpPosition[i]] = operation.itemTypeIndexs[2][i]; } else { itemSort[jpPosition[i]] = -2; } } else { itemSort[jpPosition[i]] = -2; } } for (int i = 0; i < zjPosition.Length; i++) { if (operation.itemTypeIndexs.ContainsKey(3)) { if (i < operation.itemTypeIndexs[3].Count) { itemSort[zjPosition[i]] = operation.itemTypeIndexs[3][i]; } else { itemSort[zjPosition[i]] = -2; } } else { itemSort[zjPosition[i]] = -2; } } int normalIndex = 0; for (int i = 0; i < itemSort.Count; i++) { if (itemSort[i] == -1) { itemSort[i] = operation.itemTypeIndexs[1][normalIndex]; normalIndex++; } } OnOperationTimeUpdateEvent?.Invoke(); } } private void DayResetEvent(int resetType) { OperationBase operationBase; if (OperationTimeHepler.Instance.TryGetOperationTime(operationType, out operationBase)) { if (resetType == operationBase.resetType) { UpdateRedpoint(); } } } private void OperationEndEvent(Operation operation, int state) { if (operation == operationType && state == 0) { UpdateRedpoint(); if (onStateUpdate != null) { onStateUpdate(activityID); } } } private void OperationStartEvent(Operation operation, int state) { if (operation == operationType && state == 0) { UpdateRedpoint(); if (onStateUpdate != null) { onStateUpdate(activityID); } } } #region 服务端数据 public void UpdatePlayerTurntable(IL_HAA53_tagMCActTurntablePlayerInfo package) { OperationBase operationBase; if (OperationTimeHepler.Instance.TryGetOperationTime(operationType, out operationBase)) { OperationTurntable operation = operationBase as OperationTurntable; if (operation.ActNum != package.ActNum) { return; } turntableCount = package.CanUseCount; ctgTotal = (int)package.CTGTotal; useMoneyTotal = (int)package.UseMoneyTotal; turnItemState = (int)package.TurnItemState; getItemNum = (int)package.GetItemNum; UpdateRedpoint(); if (PlayerTurntableEvent != null) { PlayerTurntableEvent(); } } } //是否已抽中 public bool IsHitItemState(int index) { return ((int)Math.Pow(2, index) & turnItemState) != 0; } public int GetRunStartIndex() { OperationBase operationBase; if (!OperationTimeHepler.Instance.TryGetOperationTime(operationType, out operationBase)) { return -1; } OperationTurntable operation = operationBase as OperationTurntable; if (itemSort.Contains(-2)) { return -1; } for (int i = 0; i < itemCount; i++) { if (!IsHitItemState(operation.turnItemList[itemSort[i]].ItemNum)) { return i; } } return -1; } //将ItemNum转化为显示的索引 public int GetHitIndex() { OperationBase operationBase; if (!OperationTimeHepler.Instance.TryGetOperationTime(operationType, out operationBase)) { return -1; } OperationTurntable operation = operationBase as OperationTurntable; for (int i = 0; i < itemCount; i++) { if (getItemNum == operation.turnItemList[itemSort[i]].ItemNum) { return i; } } return -1; } #endregion #region 红点 public Redpoint redpoint = new Redpoint(MainRedPoint.hfhdRedPoint, MainRedPoint.hfhdRedPoint * 100 + activityID); public void UpdateRedpoint() { redpoint.state = RedPointState.None; if (!IsOpen()) { return; } OperationBase operationBase; if (OperationTimeHepler.Instance.TryGetOperationTime(operationType, out operationBase)) { OperationTurntable operation = operationBase as OperationTurntable; if (turntableCount > 0) { redpoint.state = RedPointState.Simple; } } } #endregion }