-- ======================================== -- СКРИПТ ЛЕДОВОГО ПОБОИЩА (Poboishe) -- Основной файл управления PvP событием -- ======================================== -- Глобальные объекты для управления событием -- Объекты поля боя - могут открыть несколько боев Poboishe_Battle = {} -- Лагерь объекта (стороны команд) Poboishe_Side = {} -- Игроки объекты (участники события) Poboishe_Role = {} -- Обновить область реквизита объекта Poboishe_Area = {} -- Общее количество зарегистрированных игроков Poboishe_Roletotal = 0 -- Таблица опыта по уровням (50-120) Poboishe_Exp = {} Poboishe_Exp[50]= 243000 Poboishe_Exp[51]= 255000 Poboishe_Exp[52]= 265000 Poboishe_Exp[53]= 276000 Poboishe_Exp[54]= 289000 Poboishe_Exp[55]= 314000 Poboishe_Exp[56]= 327000 Poboishe_Exp[57]= 339000 Poboishe_Exp[58]= 352000 Poboishe_Exp[59]= 388000 Poboishe_Exp[60]= 507000 Poboishe_Exp[61]= 525000 Poboishe_Exp[62]= 544000 Poboishe_Exp[63]= 564000 Poboishe_Exp[64]= 582000 Poboishe_Exp[65]= 606000 Poboishe_Exp[66]= 627000 Poboishe_Exp[67]= 648000 Poboishe_Exp[68]= 670000 Poboishe_Exp[69]= 720000 Poboishe_Exp[70]= 1073000 Poboishe_Exp[71]= 1107000 Poboishe_Exp[72]= 1143000 Poboishe_Exp[73]= 1180000 Poboishe_Exp[74]= 1217000 Poboishe_Exp[75]= 1256000 Poboishe_Exp[76]= 1293000 Poboishe_Exp[77]= 1331000 Poboishe_Exp[78]= 1370000 Poboishe_Exp[79]= 2116000 Poboishe_Exp[80]= 2178000 Poboishe_Exp[81]= 2241000 Poboishe_Exp[82]= 2303000 Poboishe_Exp[83]= 2370000 Poboishe_Exp[84]= 2438000 Poboishe_Exp[85]= 2505000 Poboishe_Exp[86]= 2572000 Poboishe_Exp[87]= 2640000 Poboishe_Exp[88]= 2709000 Poboishe_Exp[89]= 2782000 Poboishe_Exp[90]= 3490000 Poboishe_Exp[91]= 3546000 Poboishe_Exp[92]= 3602000 Poboishe_Exp[93]= 3662000 Poboishe_Exp[94]= 3720000 Poboishe_Exp[95]= 3777000 Poboishe_Exp[96]= 3833000 Poboishe_Exp[97]= 3887000 Poboishe_Exp[98]= 3941000 Poboishe_Exp[99]= 3996000 Poboishe_Exp[100]= 4050000 Poboishe_Exp[101]= 4100000 Poboishe_Exp[102]= 4150000 Poboishe_Exp[103]= 4200000 Poboishe_Exp[104]= 4250000 Poboishe_Exp[105]= 4300000 Poboishe_Exp[106]= 4350000 Poboishe_Exp[107]= 4400000 Poboishe_Exp[108]= 4450000 Poboishe_Exp[109]= 4500000 Poboishe_Exp[110]= 4550000 Poboishe_Exp[111]= 4600000 Poboishe_Exp[112]= 4650000 Poboishe_Exp[113]= 4700000 Poboishe_Exp[114]= 4750000 Poboishe_Exp[115]= 4800000 Poboishe_Exp[116]= 4950000 Poboishe_Exp[117]= 5000000 Poboishe_Exp[118]= 5050000 Poboishe_Exp[119]= 5100000 Poboishe_Exp[120]= 5150000 -- ======================================== -- ОСНОВНЫЕ ФУНКЦИИ СОБЫТИЯ -- ======================================== -- Вход на локацию события -- Применяет баффы, устанавливает цвет команды, показывает время function S66_1_OnPlayerEnter(MapID, InstanceID, RoleID) local RoleObj = Poboishe_Role[RoleID] if RoleObj then RoleObj:GetAttBuff_Poboishe() -- Применяет баффы атрибутов RoleObj:WuDi_Poboishe() -- Дает неуязвимость на 15 сек RoleObj:SetColor_Poboishe() -- Устанавливает цвет команды RoleObj:ShowPoboisheTime() -- Показывает оставшееся время RoleObj:PlayerEnterPoboishe() -- Отмечает вход игрока end local BattleObj = Poboishe_Battle[InstanceID] if BattleObj then BattleObj:SendAllInfo_Poboishe() -- Отправляет информацию всем игрокам end end -- Обработка убийства персонажа -- Начисляет очки команде убийцы и создает флаг крови function s66_1_KillPeople(MapID, InstanceID, RoleID, KillerID) -- Проверяем что оба участника - игроки и убийца не равен жертве if unit.IsPlayer(RoleID) and unit.IsPlayer(KillerID) and RoleID ~= KillerID then local RoleObj = Poboishe_Role[KillerID] if RoleObj then RoleObj:GetKillExp_Poboishe() -- Начисляет опыт за убийство local point = 1 -- Очки за убийство -- Проверяем наличие флага крови у убитого local b = role.GetRoleItemNum(RoleID, 5300104) if b > 0 then local x, y, z = unit.GetPosition(MapID, InstanceID, RoleID) -- Создаем флаг крови на месте смерти map.MapCreateCreature(MapID, InstanceID, 9010354, x, y, z, 1, "") role.RemoveFromRole(MapID, InstanceID, RoleID, 5300104, 1, 101) -- Отправляем сообщение о создании флага local MsgID = msg.BeginMsgEvent() msg.AddMsgEvent(MsgID, 101, 950633) -- Флаг крови оставлен в координатах msg.AddMsgEvent(MsgID, 9, x) msg.AddMsgEvent(MsgID, 9, z) msg.DispatchMapMsgEvent(MsgID, MapID, InstanceID) end -- Начисляем очки команде убийцы local blue_war_point = map.GetMapScriptData(MapID, InstanceID, 1, 2) local red_war_point = map.GetMapScriptData(MapID, InstanceID, 1, 1) if RoleObj.Side == "Red" then Poboishe_Battle[RoleObj.InstanceID].RedPlayer.Point = Poboishe_Battle[RoleObj.InstanceID].RedPlayer.Point + point map.SetMapScriptData(MapID, InstanceID, 1, 1, red_war_point + 1) elseif RoleObj.Side == "Blue" then Poboishe_Battle[RoleObj.InstanceID].BluePlayer.Point = Poboishe_Battle[RoleObj.InstanceID].BluePlayer.Point + point map.SetMapScriptData(MapID, InstanceID, 1, 2, blue_war_point + 1) end -- Отправляем сообщение убийце local MsgID = msg.BeginMsgEvent() msg.AddMsgEvent(MsgID, 101, 206726) -- Вы убили игрока и получили опыт msg.AddMsgEvent(MsgID, 2, RoleID) msg.DispatchRoleMsgEvent(KillerID, MsgID) -- Обновляем информацию для всех игроков local BattleObj = Poboishe_Battle[InstanceID] if BattleObj then BattleObj:SendAllInfo_Poboishe() end end end end -- Игрок покидает поле боя -- Удаляет все баффы и предметы события function s66_1_LeaveMap(MapID, InstanceID, RoleID) -- Убираем состояния команд (красный/синий) unit.UnsetState(MapID, InstanceID, RoleID, 10) unit.UnsetState(MapID, InstanceID, RoleID, 11) -- Удаляем все специальные предметы события local c1 = role.GetRoleItemNum(RoleID, 6600488) local c2 = role.GetRoleItemNum(RoleID, 6600565) local c3 = role.GetRoleItemNum(RoleID, 6600566) local c4 = role.GetRoleItemNum(RoleID, 6600559) local c5 = role.GetRoleItemNum(RoleID, 6600560) local c6 = role.GetRoleItemNum(RoleID, 6600561) local c7 = role.GetRoleItemNum(RoleID, 6600562) local c8 = role.GetRoleItemNum(RoleID, 6600563) local c9 = role.GetRoleItemNum(RoleID, 6600564) if c1 > 0 then role.RemoveFromRole(MapID, InstanceID, RoleID, 6600488, c1, 101) end if c2 > 0 then role.RemoveFromRole(MapID, InstanceID, RoleID, 6600565, c2, 101) end if c3 > 0 then role.RemoveFromRole(MapID, InstanceID, RoleID, 6600566, c3, 101) end if c4 > 0 then role.RemoveFromRole(MapID, InstanceID, RoleID, 6600559, c4, 101) end if c5 > 0 then role.RemoveFromRole(MapID, InstanceID, RoleID, 6600560, c5, 101) end if c6 > 0 then role.RemoveFromRole(MapID, InstanceID, RoleID, 6600561, c6, 101) end if c7 > 0 then role.RemoveFromRole(MapID, InstanceID, RoleID, 6600562, c7, 101) end if c8 > 0 then role.RemoveFromRole(MapID, InstanceID, RoleID, 6600563, c8, 101) end if c9 > 0 then role.RemoveFromRole(MapID, InstanceID, RoleID, 6600564, c9, 101) end -- Удаляем специальные навыки role.RemoveSkill(RoleID, 91008) role.RemoveSkill(RoleID, 91009) role.RemoveSkill(RoleID, 91010) -- Обрабатываем флаг крови если есть local b = role.GetRoleItemNum(RoleID, 5300104) if b > 0 then -- Создаем флаг крови в стандартной позиции map.MapCreateCreature(MapID, InstanceID, 9010354, 181, 7239, 208, 1, "") unit.CancelBuff(MapID, InstanceID, RoleID, 9995801) role.RemoveFromRole(MapID, InstanceID, RoleID, 5300104, 1, 101) -- Отправляем сообщение о появлении флага local MsgID = msg.BeginMsgEvent() msg.AddMsgEvent(MsgID, 101, 950632) -- Флаг крови появился на просторах Снежного пика msg.DispatchMapMsgEvent(MsgID, MapID, InstanceID) end -- Обновляем состояние игрока local RoleObj = Poboishe_Role[RoleID] if RoleObj then RoleObj:PlayerLeavePoboishe() local BattleObj = Poboishe_Battle[InstanceID] if BattleObj then BattleObj:SendAllInfo_Poboishe() end end end -- Воскрешение игрока -- Возвращает игрока в случайную точку возрождения function s66_1_RoloRevive(MapID, InstanceID, RoleID, Type, ReviveHP, ReviveMP, x, y, z, RebornMapID) -- Устанавливаем полное здоровье и ману ReviveHP = role.GetRoleAttValue(MapID, InstanceID, RoleID, 8) ReviveMP = role.GetRoleAttValue(MapID, InstanceID, RoleID, 10) -- Выбираем случайную точку возрождения local k = math.random(1, 9) local RoleObj = Poboishe_Role[RoleID] if RoleObj then RoleObj:WuDi_Poboishe() -- Даем неуязвимость end -- Возвращаем координаты возрождения return ReviveHP, ReviveMP, S66_1_Point[k].x, S66_1_Point[k].y * 51, S66_1_Point[k].z, MapID end -- Проверка на отношения между игроками -- Определяет дружественные/враждебные отношения function s66_1_FriendEnemy(MapID, InstanceID, SrcID, TargetID) if unit.IsPlayer(SrcID) and unit.IsPlayer(TargetID) then local RoleObj1 = GetPoboisheRoleObj(SrcID) local RoleObj2 = GetPoboisheRoleObj(TargetID) if RoleObj1 and RoleObj2 then if RoleObj1.Side == RoleObj2.Side then return true, false, false, true -- Союзники else return false, true, false, true -- Противники end end end return false, false, false, false -- Нейтральные отношения end -- ======================================== -- РЕГИСТРАЦИЯ СОБЫТИЙ КАРТЫ -- ======================================== aux.RegisterMapEvent("s66_1", 2, "S66_1_OnPlayerEnter") -- Вход на карту aux.RegisterMapEvent("s66_1", 5, "s66_1_KillPeople") -- Убийство игрока aux.RegisterMapEvent("s66_1", 3, "s66_1_LeaveMap") -- Выход с карты aux.RegisterMapEvent("s66_1", 11, "s66_1_RoloRevive") -- Воскрешение aux.RegisterMapEvent("s66_1", 16, "s66_1_FriendEnemy") -- Проверка отношений