--Регистрация function CreatKingRoleObj(RoleID) if King_Role[RoleID] == nil then local Target_MapID, Target_InstanceID = role.GetRoleMapID(RoleID) local rolelevel = role.GetRoleLevel(Target_MapID, Target_InstanceID, RoleID) if rolelevel >= 45 then King_Roletotal = King_Roletotal + 1 King_Role[RoleID] = {RoleID = RoleID, Time = 0, Side = "None", InstanceID = 1,State = "OutSide",Kill = 0} local Guild = guild.GetRoleGuildID(RoleID) local FamilyID = role.GetRoleFamilyID(Target_MapID, Target_InstanceID, RoleID) if Guild ~= nil and Guild ~= 4294967295 then King_Role[RoleID].Guild = Guild else King_Role[RoleID].Guild = 0 end if FamilyID ~= nil and FamilyID ~= 4294967295 then King_Role[RoleID].FamilyID = FamilyID else King_Role[RoleID].FamilyID = 0 end King_Role[RoleID].ShowKingTime = ShowKingTime King_Role[RoleID].GetAttBuff_King = GetAttBuff_King King_Role[RoleID].WuDi_King = WuDi_King King_Role[RoleID].SetColor_King = SetColor_King King_Role[RoleID].SendInfo_King = SendInfo_King King_Role[RoleID].PlayerLeaveKing = PlayerLeaveKing King_Role[RoleID].PlayerEnterKing = PlayerEnterKing King_Role[RoleID].GetKillExp_King = GetKillExp_King end end end --Создание групп function CreatKingSideObj() local k = #King_Side + 1 King_Side[k] = {Player={},InSidePlayer={},Num = 0,Point = 0} if k%2 == 1 then King_Side[k].Side = "Red" else King_Side[k].Side = "Blue" end King_Side[k].PlayerJoinKingSide = PlayerJoinKingSide return King_Side[k] end --Присоединение к группе function PlayerJoinKingSide(Obj,PlayerID) table.insert(Obj.Player,PlayerID) King_Role[PlayerID].Side = Obj.Side end --Создание поля боя function CreatKingnBattleObj(RedPlayer,BluePlayer) local k = #King_Battle + 1 map.CreateInstance(br_MapID, k) King_Battle[k] = {RedPlayer = RedPlayer,BluePlayer = BluePlayer,InstanceID=k} for k1,v in pairs(RedPlayer.Player) do King_Role[v].InstanceID = k end for k1,v in pairs(BluePlayer.Player) do King_Role[v].InstanceID = k end King_Battle[k].SendAllInfo_King = SendAllInfo_King King_Battle[k].SetPlayerPoint_King = SetPlayerPoint_King King_Battle[k].SetPlayerFinalPoint_King = SetPlayerFinalPoint_King King_Battle[k].ResetInSidePlayer_King = ResetInSidePlayer_King end --Получение игроков поля боя function GetKingRoleObj(RoleID) return King_Role[RoleID] end --Выбор стороны function King_ChooseSide() if King_Roletotal > 159 then local k = math.floor(King_Roletotal/80) local av_player = math.floor(King_Roletotal/k) local num = {} for i = 1,k do if i ~= k then num[i] = av_player else num[i] = King_Roletotal - av_player*(k-1) end end local Player = {} local Playertotal = 0 local function GetIndex(Playertotal) local total = 0 for i = 1,k do total = total + num[i] if total >= Playertotal then return i end end end for k1,v in pairs(King_Role) do Playertotal = Playertotal + 1 local index = GetIndex(Playertotal) --v.InstanceID = index if Player[index] == nil then Player[index] = {} end table.insert(Player[index],k1) end for i = 1,k do local RedSideObj = CreatKingSideObj() local BlueSideObj = CreatKingSideObj() local red = 0 local times = 0 while red < num[i]/2 do RedSideObj:PlayerJoinKingSide(Player[i][1]) local Player1Obj = GetKingRoleObj(Player[i][1]) red = red + 1 for k1,v in pairs(Player[i]) do local PlayerObj = GetKingRoleObj(v) if PlayerObj.RoleID ~= v and ((PlayerObj.Guild ~= 0 and PlayerObj.Guild == Player1Obj.Guild) or (PlayerObj.FamilyID ~= 0 and PlayerObj.FamilyID == Player1Obj.FamilyID)) then RedSideObj:PlayerJoinKingSide(v) red = red + 1 table.remove(Player[i],k1) if red >= num[i]/2 then break end end end table.remove(Player[i],1) times = times + 1 if times > 160 then break end end --RedSideObj.Num = red for k1,v in pairs(Player[i]) do BlueSideObj:PlayerJoinKingSide(v) -- BlueSideObj.Num = BlueSideObj.Num + 1 end CreatKingnBattleObj(RedSideObj,BlueSideObj) end else local Player = {} for k,v in pairs(King_Role) do table.insert(Player,k) --v.InstanceID = 1 end local RedSideObj = CreatKingSideObj() local BlueSideObj = CreatKingSideObj() local red = 0 local times = 0 while red < King_Roletotal/2 do RedSideObj:PlayerJoinKingSide(Player[1]) local Player1Obj = GetKingRoleObj(Player[1]) red = red + 1 for k1,v in pairs(Player) do local PlayerObj = GetKingRoleObj(v) if PlayerObj.RoleID ~= v and ((PlayerObj.Guild ~= 0 and PlayerObj.Guild == Player1Obj.Guild) or (PlayerObj.FamilyID ~= 0 and PlayerObj.FamilyID == Player1Obj.FamilyID)) then RedSideObj:PlayerJoinKingSide(v) red = red + 1 table.remove(Player,k1) if red >= King_Roletotal/2 then break end end end table.remove(Player,1) times = times + 1 if times > 160 then break end end --RedSideObj.Num = red for k1,v in pairs(Player) do BlueSideObj:PlayerJoinKingSide(v) -- BlueSideObj.Num = BlueSideObj.Num + 1 end CreatKingnBattleObj(RedSideObj,BlueSideObj) end end --время боя function ShowKingTime(RoleObj) local leftSec = 1800 local Min = tonumber(os.date("%M")) local Second = tonumber(os.date("%S")) leftSec = leftSec - Min*60 - Second local MsgID = msg.BeginMsgEvent() msg.AddMsgEvent(MsgID, 16, 28) msg.AddMsgEvent(MsgID, 16, leftSec) msg.DispatchRoleMsgEvent(RoleObj.RoleID, MsgID) end --Бафф function GetAttBuff_King(RoleObj) local rolelevel = role.GetRoleLevel(br_MapID, RoleObj.InstanceID, RoleObj.RoleID) if rolelevel > 100 then rolelevel = 100 end if rolelevel >= 40 then local index = math.floor((rolelevel-50)/5) + 1 unit.AddBuff(br_MapID, RoleObj.InstanceID, RoleObj.RoleID, index*100+6107001, RoleObj.RoleID) end end --Получение опыта за убийство function GetKillExp_King(RoleObj) local rolelevel = role.GetRoleLevel(br_MapID, RoleObj.InstanceID, RoleObj.RoleID) if rolelevel < 45 then rolelevel = 45 elseif rolelevel > 100 then rolelevel = 100 end RoleObj.Kill = RoleObj.Kill + 1 local exp1 = math.floor(King_Exp[rolelevel] / 10) if RoleObj.Kill > 30 then exp1 = 0 else role.AddRoleExp(br_MapID, RoleObj.InstanceID, RoleObj.RoleID, exp1) end local MsgID = msg.BeginMsgEvent() msg.AddMsgEvent(MsgID, 13, 0) msg.AddMsgEvent(MsgID, 1, 206731) --Убито: <p1>, получено <p2> очков опыта. (Максимум можно получить 30-ти кратный опыт) msg.AddMsgEvent(MsgID, 9, RoleObj.Kill) msg.AddMsgEvent(MsgID, 9, exp1) msg.DispatchRoleMsgEvent(RoleObj.RoleID, MsgID) end --Баф при начале боя или смерти на 15 секунд function WuDi_King(RoleObj) unit.AddBuff(br_MapID, RoleObj.InstanceID, RoleObj.RoleID, 6109401, RoleObj.RoleID) end --Цвет команд function SetColor_King(RoleObj) if RoleObj.Side == "Red" then unit.SetState(br_MapID, RoleObj.InstanceID, RoleObj.RoleID, 10) else unit.SetState(br_MapID, RoleObj.InstanceID, RoleObj.RoleID, 11) end end --Отправка информации function SendInfo_King(RoleObj) local redpoint = King_Battle[RoleObj.InstanceID].RedPlayer.Point local rednum = King_Battle[RoleObj.InstanceID].RedPlayer.Num local bluepoint = King_Battle[RoleObj.InstanceID].BluePlayer.Point local bluenum = King_Battle[RoleObj.InstanceID].BluePlayer.Num local char = redpoint..","..rednum..","..bluepoint..","..bluenum role.DotaSendMsg(br_MapID, RoleObj.InstanceID, RoleObj.RoleID, 1, char) end --Вход игроков на поле плюсование function PlayerEnterKing(RoleObj) RoleObj.State = "InSide" local tbl = {} if RoleObj.Side == "Red" then King_Battle[RoleObj.InstanceID].RedPlayer.Num = King_Battle[RoleObj.InstanceID].RedPlayer.Num + 1 tbl = King_Battle[RoleObj.InstanceID].RedPlayer.InSidePlayer elseif RoleObj.Side == "Blue" then King_Battle[RoleObj.InstanceID].BluePlayer.Num = King_Battle[RoleObj.InstanceID].BluePlayer.Num + 1 tbl = King_Battle[RoleObj.InstanceID].BluePlayer.InSidePlayer end table.insert(tbl,RoleObj.RoleID) end --покидает поле боя отнимание function PlayerLeaveKing(RoleObj) RoleObj.State = "OutSide" local tbl = {} if RoleObj.Side == "Red" then King_Battle[RoleObj.InstanceID].RedPlayer.Num = King_Battle[RoleObj.InstanceID].RedPlayer.Num - 1 tbl = King_Battle[RoleObj.InstanceID].RedPlayer.InSidePlayer elseif RoleObj.Side == "Blue" then King_Battle[RoleObj.InstanceID].BluePlayer.Num = King_Battle[RoleObj.InstanceID].BluePlayer.Num - 1 tbl = King_Battle[RoleObj.InstanceID].BluePlayer.InSidePlayer end for k,v in pairs(tbl) do if v == RoleObj.RoleID then table.remove(tbl,k) end end end --Информация за обе команды function SendAllInfo_King(BattleObj) for k,v in pairs(BattleObj.RedPlayer.Player) do local RoleObj = GetKingRoleObj(v) local Target_MapID, Target_InstanceID = role.GetRoleMapID(RoleObj.RoleID) if Target_MapID ~= nil and Target_InstanceID ~= nil and Target_MapID == br_MapID and RoleObj.InstanceID == Target_InstanceID then RoleObj:SendInfo_King() end end for k,v in pairs(BattleObj.BluePlayer.Player) do local RoleObj = GetKingRoleObj(v) local Target_MapID, Target_InstanceID = role.GetRoleMapID(RoleObj.RoleID) if Target_MapID ~= nil and Target_InstanceID ~= nil and Target_MapID == br_MapID and RoleObj.InstanceID == Target_InstanceID then RoleObj:SendInfo_King() end end end --очки персонажа function SetPlayerPoint_King(BattleObj) local RedSideObj = BattleObj.RedPlayer local BlueSideObj = BattleObj.BluePlayer for k,v in pairs(RedSideObj.Player) do local RoleObj = King_Role[v] if RoleObj.State == "InSide" then local Target_MapID, Target_InstanceID = role.GetRoleMapID(RoleObj.RoleID) if Target_MapID ~= nil then if not unit.IsDead(Target_MapID, Target_InstanceID, RoleObj.RoleID) then role.SetRoleScriptData(RoleObj.RoleID, 1, RoleDataType["King_Point"], role.GetRoleScriptData(RoleObj.RoleID, 1, RoleDataType["King_Point"])+1) end end end end for k,v in pairs(BlueSideObj.Player) do local RoleObj = King_Role[v] if RoleObj.State == "InSide" then local Target_MapID, Target_InstanceID = role.GetRoleMapID(RoleObj.RoleID) if Target_MapID ~= nil then if not unit.IsDead(Target_MapID, Target_InstanceID, RoleObj.RoleID) then role.SetRoleScriptData(RoleObj.RoleID, 1, RoleDataType["King_Point"], role.GetRoleScriptData(RoleObj.RoleID, 1, RoleDataType["King_Point"])+1) end end end end end --Очки за выйграш function SetPlayerFinalPoint_King(BattleObj) local RedSideObj = BattleObj.RedPlayer local BlueSideObj = BattleObj.BluePlayer if RedSideObj.Point >= BlueSideObj.Point then for k,v in pairs(RedSideObj.Player) do local RoleObj = King_Role[v] if RoleObj.State == "InSide" then local Target_MapID, Target_InstanceID = role.GetRoleMapID(RoleObj.RoleID) if Target_MapID ~= nil then if not unit.IsDead(Target_MapID, Target_InstanceID, RoleObj.RoleID) then role.SetRoleScriptData(RoleObj.RoleID, 1, RoleDataType["King_win"], 1) local MsgID = msg.BeginMsgEvent() msg.AddMsgEvent(MsgID, 102, 900246) msg.AddMsgEvent(MsgID, 5, TargetTypeID) msg.DispatchWorldMsgEvent(MsgID) end end end end end if RedSideObj.Point <= BlueSideObj.Point then for k,v in pairs(BlueSideObj.Player) do local RoleObj = King_Role[v] if RoleObj.State == "InSide" then local Target_MapID, Target_InstanceID = role.GetRoleMapID(RoleObj.RoleID) if Target_MapID ~= nil then if not unit.IsDead(Target_MapID, Target_InstanceID, RoleObj.RoleID) then role.SetRoleScriptData(RoleObj.RoleID, 1, RoleDataType["King_win"], 1) local MsgID = msg.BeginMsgEvent() msg.AddMsgEvent(MsgID, 102, 900247) msg.AddMsgEvent(MsgID, 5, TargetTypeID) msg.DispatchWorldMsgEvent(MsgID) end end end end if RedSideObj.Point == BlueSideObj.Point then for k,v in pairs(BlueSideObj.Player) do local RoleObj = King_Role[v] if RoleObj.State == "InSide" then local Target_MapID, Target_InstanceID = role.GetRoleMapID(RoleObj.RoleID) if Target_MapID ~= nil then if not unit.IsDead(Target_MapID, Target_InstanceID, RoleObj.RoleID) then role.SetRoleScriptData(RoleObj.RoleID, 1, RoleDataType["King_win"], 2) local MsgID = msg.BeginMsgEvent() msg.AddMsgEvent(MsgID, 102, 900248) msg.AddMsgEvent(MsgID, 5, TargetTypeID) msg.DispatchWorldMsgEvent(MsgID) end end end end end end end --обновление игроков function ResetInSidePlayer_King(BattleObj) local function reset(tbl) local tbl_new = {} if #tbl > 0 then for i = 1,#tbl do local index = math.random(#tbl) table.insert(tbl_new,tbl[index]) table.remove(tbl,index) end end return tbl_new end BattleObj.BluePlayer.InSidePlayer = reset(BattleObj.BluePlayer.InSidePlayer) BattleObj.RedPlayer.InSidePlayer = reset(BattleObj.RedPlayer.InSidePlayer) end