using ProtoCSStruct; using Sog; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using static Google.Protobuf.WellKnownTypes.Field.Types; namespace Game { public class SkinSvc { public static void OnPlayerBorn(PlayerOnGame player) { var list = CommParamDescMgr.Instance.DefaultSkin.int_list; foreach (var skinId in list) { if (skinId > 0) { AddSkin(player, skinId, false); } } } public static void OnPlayerOnline(PlayerOnGame player) { CalcBenifits(player); } public static bool AddSkin(PlayerOnGame player, int skinId, bool sendMsg = true) { bool isExist = false; for (var i = 0; i < player.RoleData.Skin.Skins.Count; i++) { if (player.RoleData.Skin.Skins[i].SkinId == skinId) { isExist = true; break; } } if (isExist) { return false; } //var desc = RoleModelDescMgr.Instance.GetConfig(skinId); //player.RoleData.PowerPointData.ExtMopTimes += desc.condition1; DBSkinOne skin = new DBSkinOne(); skin.SkinId = skinId; skin.UnlockTime = AppTime.ServerAppTime.GetTime(); skin.NewGet = true; player.RoleData.Skin.Skins.Add(ref skin); if (player.RoleData.Skin.Skins.Count == 1) { player.RoleData.Skin.NowSkin = skinId; player.RoleData.Knight.DbHero.Skin = skinId; } var omop = SkinSvc.GetBenifitValue(player, "addSweepTimes"); CalcBenifits(player); var nmop = SkinSvc.GetBenifitValue(player, "addSweepTimes"); if(nmop > omop) { player.RoleData.PowerPointData.ExtMopTimes += nmop - omop; } if (sendMsg) { CSSkinSync sync = new CSSkinSync(); sync.Skins.CopyFrom(ref player.RoleData.Skin); player.SendToClient((int)CSGameMsgID.SkinSync, ref sync); RolePropUtil.RecalRoleProp(player, true); PlayerDataSvc.SyncPower(player); } return true; } public static void CalcBenifits(PlayerOnGame player) { player.RoleData.Skin.Benifits.Clear(); var bmap = new Dictionary(); for (var i = 0; i < player.RoleData.Skin.Skins.Count; i++) { var skinId = player.RoleData.Skin.Skins[i].SkinId; var desc = RoleModelDescMgr.Instance.GetConfig(skinId); for (var j = 0; j < desc.benefitType.Length; j++) { var t = desc.benefitType[j]; var v = desc.benefitValue[j]; if(bmap.ContainsKey(t)) { bmap[t] += v; } else { bmap[t] = v; } } } foreach (var item in bmap) { var idv = new TypeIDValueString { Value = item.Value }; idv.Id.SetString(item.Key); player.RoleData.Skin.Benifits.Add(ref idv); } } public static int GetBenifitValue(PlayerOnGame player, string type) { for (var i = 0; i < player.RoleData.Skin.Benifits.Count; i++) { if (player.RoleData.Skin.Benifits[i].Id.GetString() == type) { return player.RoleData.Skin.Benifits[i].Value; } } return 0; } public static void CalcSkinProps(ref DBRoleData roleData, RoleProp roleProp) { for (var i = 0; i < roleData.Skin.Skins.Count; i++) { var skinId = roleData.Skin.Skins[i].SkinId; var desc = RoleModelDescMgr.Instance.GetConfig(skinId); for (var j = 0; j < desc.propType.Length; j++) { roleProp.AddProp(desc.propType[j], desc.propValue[j]); } } } public static void PutonOnSkin(PlayerOnGame player, StructPacket packet) { ref var req = ref packet.GetMessage(); var res = new CSSkinPutonRes(); res.SkinId = req.SkinId; res.Ret = CSErrCode.Fail; bool isExist = false; for (var i = 0; i < player.RoleData.Skin.Skins.Count; i++) { if (player.RoleData.Skin.Skins[i].SkinId == req.SkinId) { isExist = true; break; } } if (!isExist) { player.SendToClient((int)CSGameMsgID.SkinPutonRes, ref res); return; } player.RoleData.Skin.NowSkin = req.SkinId; player.RoleData.Knight.DbHero.Skin = req.SkinId; res.Ret = CSErrCode.None; res.SkinData.CopyFrom(ref player.RoleData.Skin); player.MakeDirty(); player.SendToClient((int)CSGameMsgID.SkinPutonRes, ref res); PlayerNotify.NotifyPlayerShowInfoChange(player); } public static void SkinSetNewget(PlayerOnGame player, StructPacket packet) { ref var req = ref packet.GetMessage(); var res = new CSSkinSetNewGetRes(); bool isExist = false; for (var i = 0; i < player.RoleData.Skin.Skins.Count; i++) { if (player.RoleData.Skin.Skins[i].NewGet ) { player.RoleData.Skin.Skins[i].NewGet = false; isExist = true; } } if (isExist) { player.MakeDirty(); CSSkinSync sync = new CSSkinSync(); sync.Skins.CopyFrom(ref player.RoleData.Skin); player.SendToClient((int)CSGameMsgID.SkinSync, ref sync); } player.SendToClient((int)CSGameMsgID.SkinSetNewgetRes, ref res); } } }