➕PVP
This commit is contained in:
parent
c8a1d72e2a
commit
1b042d98e6
|
@ -0,0 +1,344 @@
|
||||||
|
using SCHALE.Common.Database;
|
||||||
|
using SCHALE.Common.FlatData;
|
||||||
|
using SCHALE.Common.NetworkProtocol;
|
||||||
|
using SCHALE.GameServer.Services;
|
||||||
|
|
||||||
|
namespace SCHALE.GameServer.Controllers.Api.ProtocolHandlers
|
||||||
|
{
|
||||||
|
public class Arena(
|
||||||
|
IProtocolHandlerFactory protocolHandlerFactory,
|
||||||
|
ISessionKeyService _sessionKeyService,
|
||||||
|
SCHALEContext _context
|
||||||
|
) : ProtocolHandlerBase(protocolHandlerFactory)
|
||||||
|
{
|
||||||
|
private readonly ISessionKeyService sessionKeyService = _sessionKeyService;
|
||||||
|
private readonly SCHALEContext context = _context;
|
||||||
|
|
||||||
|
private EquipmentDB GetEquipmentDB(long accountServerId, long equipmentServerId)
|
||||||
|
{
|
||||||
|
if (equipmentServerId == 0)
|
||||||
|
return new EquipmentDB();
|
||||||
|
var equipmentDB = context
|
||||||
|
.Equipment.OrderBy(row => row.ServerId)
|
||||||
|
.LastOrDefault(c =>
|
||||||
|
c.AccountServerId == accountServerId && c.ServerId == equipmentServerId
|
||||||
|
);
|
||||||
|
ArgumentNullException.ThrowIfNull(equipmentDB);
|
||||||
|
return equipmentDB;
|
||||||
|
}
|
||||||
|
|
||||||
|
private ArenaCharacterDB Convert(long accountServerId, long characterServerId)
|
||||||
|
{
|
||||||
|
if (characterServerId == 0)
|
||||||
|
return new ArenaCharacterDB();
|
||||||
|
var characterDB = context
|
||||||
|
.Characters.OrderBy(row => row.ServerId)
|
||||||
|
.LastOrDefault(c =>
|
||||||
|
c.AccountServerId == accountServerId && c.ServerId == characterServerId
|
||||||
|
);
|
||||||
|
ArgumentNullException.ThrowIfNull(characterDB);
|
||||||
|
return Convert(characterDB);
|
||||||
|
}
|
||||||
|
|
||||||
|
private ArenaCharacterDB Convert(CharacterDB db)
|
||||||
|
{
|
||||||
|
var res = new ArenaCharacterDB
|
||||||
|
{
|
||||||
|
UniqueId = db.UniqueId,
|
||||||
|
StarGrade = db.StarGrade,
|
||||||
|
Level = db.Level,
|
||||||
|
PublicSkillLevel = db.PublicSkillLevel,
|
||||||
|
ExSkillLevel = db.ExSkillLevel,
|
||||||
|
PassiveSkillLevel = db.PassiveSkillLevel,
|
||||||
|
ExtraPassiveSkillLevel = db.ExtraPassiveSkillLevel,
|
||||||
|
LeaderSkillLevel = db.LeaderSkillLevel,
|
||||||
|
EquipmentDBs = db
|
||||||
|
.EquipmentServerIds.Select(i => GetEquipmentDB(db.AccountServerId, i))
|
||||||
|
.ToList()[..3],
|
||||||
|
FavorRankInfo = new Dictionary<long, long>
|
||||||
|
{
|
||||||
|
// TODO: add all
|
||||||
|
{ db.UniqueId, db.FavorRank }
|
||||||
|
},
|
||||||
|
PotentialStats = db.PotentialStats
|
||||||
|
};
|
||||||
|
var weaponDB = context
|
||||||
|
.Weapons.OrderBy(row => row.ServerId)
|
||||||
|
.LastOrDefault(w =>
|
||||||
|
w.AccountServerId == db.ServerId && w.BoundCharacterServerId == db.ServerId
|
||||||
|
);
|
||||||
|
if (weaponDB != null)
|
||||||
|
res.WeaponDB = weaponDB;
|
||||||
|
var gearDB = context
|
||||||
|
.Gears.OrderBy(row => row.ServerId)
|
||||||
|
.LastOrDefault(w =>
|
||||||
|
w.AccountServerId == db.ServerId && w.BoundCharacterServerId == db.ServerId
|
||||||
|
);
|
||||||
|
if (gearDB != null)
|
||||||
|
res.GearDB = gearDB;
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
private ArenaTeamSettingDB Convert(EchelonDB db)
|
||||||
|
{
|
||||||
|
var LeaderCharacterId = context
|
||||||
|
.Characters.OrderBy(row => row.ServerId)
|
||||||
|
.LastOrDefault(c =>
|
||||||
|
c.AccountServerId == db.AccountServerId && c.ServerId == db.LeaderServerId
|
||||||
|
)
|
||||||
|
?.UniqueId;
|
||||||
|
ArgumentNullException.ThrowIfNull(LeaderCharacterId);
|
||||||
|
|
||||||
|
return new ArenaTeamSettingDB()
|
||||||
|
{
|
||||||
|
EchelonType = db.EchelonType,
|
||||||
|
LeaderCharacterId = LeaderCharacterId.Value,
|
||||||
|
MainCharacters = db
|
||||||
|
.MainSlotServerIds.Select(i => Convert(db.AccountServerId, i))
|
||||||
|
.ToList(),
|
||||||
|
SupportCharacters = db
|
||||||
|
.SupportSlotServerIds.Select(i => Convert(db.AccountServerId, i))
|
||||||
|
.ToList(),
|
||||||
|
MapId = 1001,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
private static readonly ArenaTeamSettingDB dummyTeam =
|
||||||
|
new()
|
||||||
|
{
|
||||||
|
EchelonType = EchelonType.ArenaDefence,
|
||||||
|
LeaderCharacterId = 10065,
|
||||||
|
MainCharacters =
|
||||||
|
[
|
||||||
|
new ArenaCharacterDB(),
|
||||||
|
new ArenaCharacterDB()
|
||||||
|
{
|
||||||
|
UniqueId = 10065,
|
||||||
|
StarGrade = 3,
|
||||||
|
Level = 90,
|
||||||
|
PublicSkillLevel = 1,
|
||||||
|
ExSkillLevel = 1,
|
||||||
|
PassiveSkillLevel = 1,
|
||||||
|
ExtraPassiveSkillLevel = 1,
|
||||||
|
LeaderSkillLevel = 1
|
||||||
|
}
|
||||||
|
],
|
||||||
|
MapId = 1001,
|
||||||
|
};
|
||||||
|
|
||||||
|
private ArenaTeamSettingDB? GetDefense(long accountId)
|
||||||
|
{
|
||||||
|
var defense = context
|
||||||
|
.Echelons.OrderBy(row => row.ServerId)
|
||||||
|
.LastOrDefault(e =>
|
||||||
|
e.AccountServerId == accountId
|
||||||
|
&& e.EchelonType == EchelonType.ArenaDefence
|
||||||
|
&& e.EchelonNumber == 1
|
||||||
|
&& e.ExtensionType == EchelonExtensionType.Base
|
||||||
|
);
|
||||||
|
if (defense == null)
|
||||||
|
return null;
|
||||||
|
return Convert(defense);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static List<ArenaUserDB> DummyOpponent(ArenaTeamSettingDB? team)
|
||||||
|
{
|
||||||
|
return
|
||||||
|
[
|
||||||
|
new ArenaUserDB()
|
||||||
|
{
|
||||||
|
RepresentCharacterUniqueId = 20024,
|
||||||
|
NickName = "your",
|
||||||
|
Rank = 2,
|
||||||
|
Level = 90,
|
||||||
|
TeamSettingDB = team ?? dummyTeam
|
||||||
|
},
|
||||||
|
new ArenaUserDB()
|
||||||
|
{
|
||||||
|
RepresentCharacterUniqueId = 10059,
|
||||||
|
NickName = "defense",
|
||||||
|
Rank = 3,
|
||||||
|
Level = 90,
|
||||||
|
TeamSettingDB = team ?? dummyTeam
|
||||||
|
},
|
||||||
|
new ArenaUserDB()
|
||||||
|
{
|
||||||
|
RepresentCharacterUniqueId = 10065,
|
||||||
|
NickName = "team",
|
||||||
|
Rank = 4,
|
||||||
|
Level = 90,
|
||||||
|
TeamSettingDB = team ?? dummyTeam
|
||||||
|
}
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
[ProtocolHandler(Protocol.Arena_EnterLobby)]
|
||||||
|
public ResponsePacket EnterLobbyHandler(ArenaEnterLobbyRequest req)
|
||||||
|
{
|
||||||
|
return new ArenaEnterLobbyResponse()
|
||||||
|
{
|
||||||
|
ArenaPlayerInfoDB = new()
|
||||||
|
{
|
||||||
|
CurrentSeasonId = 6,
|
||||||
|
PlayerGroupId = 1,
|
||||||
|
CurrentRank = 1,
|
||||||
|
SeasonRecord = 1,
|
||||||
|
AllTimeRecord = 1
|
||||||
|
},
|
||||||
|
OpponentUserDBs = DummyOpponent(GetDefense(req.AccountId)),
|
||||||
|
MapId = 1001,
|
||||||
|
AutoRefreshTime = DateTime.Parse("2099-01-01T00:00:00")
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
[ProtocolHandler(Protocol.Arena_OpponentList)]
|
||||||
|
public ResponsePacket OpponentListHandler(ArenaOpponentListRequest req)
|
||||||
|
{
|
||||||
|
return new ArenaOpponentListResponse()
|
||||||
|
{
|
||||||
|
PlayerRank = 1,
|
||||||
|
OpponentUserDBs = DummyOpponent(GetDefense(req.AccountId))
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
[ProtocolHandler(Protocol.Arena_SyncEchelonSettingTime)]
|
||||||
|
public ResponsePacket SyncEchelonSettingTimeHandler(ArenaSyncEchelonSettingTimeRequest req)
|
||||||
|
{
|
||||||
|
return new ArenaSyncEchelonSettingTimeResponse() { EchelonSettingTime = DateTime.Now };
|
||||||
|
}
|
||||||
|
|
||||||
|
[ProtocolHandler(Protocol.Arena_EnterBattlePart1)]
|
||||||
|
public ResponsePacket EnterBattlePart1Handler(ArenaEnterBattlePart1Request req)
|
||||||
|
{
|
||||||
|
var attack = context
|
||||||
|
.Echelons.OrderBy(row => row.ServerId)
|
||||||
|
.LastOrDefault(e =>
|
||||||
|
e.AccountServerId == req.AccountId
|
||||||
|
&& e.EchelonType == EchelonType.ArenaAttack
|
||||||
|
&& e.EchelonNumber == 1
|
||||||
|
&& e.ExtensionType == EchelonExtensionType.Base
|
||||||
|
);
|
||||||
|
ArgumentNullException.ThrowIfNull(attack);
|
||||||
|
|
||||||
|
ArenaUserDB arenaUserDB =
|
||||||
|
new()
|
||||||
|
{
|
||||||
|
RepresentCharacterUniqueId = 10059,
|
||||||
|
NickName = "You",
|
||||||
|
Rank = 1,
|
||||||
|
Level = 90,
|
||||||
|
TeamSettingDB = Convert(attack)
|
||||||
|
};
|
||||||
|
return new ArenaEnterBattlePart1Response()
|
||||||
|
{
|
||||||
|
ArenaBattleDB = new()
|
||||||
|
{
|
||||||
|
Season = 6,
|
||||||
|
Group = 1,
|
||||||
|
BattleStartTime = DateTime.Now,
|
||||||
|
Seed = 1,
|
||||||
|
AttackingUserDB = arenaUserDB,
|
||||||
|
DefendingUserDB = DummyOpponent(GetDefense(req.AccountId))[0]
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
[ProtocolHandler(Protocol.Arena_EnterBattlePart2)]
|
||||||
|
public ResponsePacket EnterBattlePart2Handler(ArenaEnterBattlePart2Request req)
|
||||||
|
{
|
||||||
|
return new ArenaEnterBattlePart2Response()
|
||||||
|
{
|
||||||
|
ArenaBattleDB = req.ArenaBattleDB,
|
||||||
|
ArenaPlayerInfoDB = new ArenaPlayerInfoDB()
|
||||||
|
{
|
||||||
|
CurrentSeasonId = 6,
|
||||||
|
PlayerGroupId = 1,
|
||||||
|
CurrentRank = 1,
|
||||||
|
SeasonRecord = 1,
|
||||||
|
AllTimeRecord = 1
|
||||||
|
},
|
||||||
|
AccountCurrencyDB = new AccountCurrencyDB
|
||||||
|
{
|
||||||
|
AccountLevel = 90,
|
||||||
|
AcademyLocationRankSum = 1,
|
||||||
|
CurrencyDict = new Dictionary<CurrencyTypes, long>
|
||||||
|
{
|
||||||
|
{ CurrencyTypes.Gem, long.MaxValue }, // gacha currency 600
|
||||||
|
{ CurrencyTypes.GemPaid, 0 },
|
||||||
|
{ CurrencyTypes.GemBonus, long.MaxValue }, // default blue gem?
|
||||||
|
{ CurrencyTypes.Gold, 962_350_000 }, // credit 10,000
|
||||||
|
{ CurrencyTypes.ActionPoint, long.MaxValue }, // energy 24
|
||||||
|
{ CurrencyTypes.AcademyTicket, 3 },
|
||||||
|
{ CurrencyTypes.ArenaTicket, 5 },
|
||||||
|
{ CurrencyTypes.RaidTicket, 3 },
|
||||||
|
{ CurrencyTypes.WeekDungeonChaserATicket, 0 },
|
||||||
|
{ CurrencyTypes.WeekDungeonChaserBTicket, 0 },
|
||||||
|
{ CurrencyTypes.WeekDungeonChaserCTicket, 0 },
|
||||||
|
{ CurrencyTypes.SchoolDungeonATicket, 0 },
|
||||||
|
{ CurrencyTypes.SchoolDungeonBTicket, 0 },
|
||||||
|
{ CurrencyTypes.SchoolDungeonCTicket, 0 },
|
||||||
|
{ CurrencyTypes.TimeAttackDungeonTicket, 3 },
|
||||||
|
{ CurrencyTypes.MasterCoin, 0 },
|
||||||
|
{ CurrencyTypes.WorldRaidTicketA, 40 },
|
||||||
|
{ CurrencyTypes.WorldRaidTicketB, 40 },
|
||||||
|
{ CurrencyTypes.WorldRaidTicketC, 40 },
|
||||||
|
{ CurrencyTypes.ChaserTotalTicket, 6 },
|
||||||
|
{ CurrencyTypes.SchoolDungeonTotalTicket, 6 },
|
||||||
|
{ CurrencyTypes.EliminateTicketA, 1 },
|
||||||
|
{ CurrencyTypes.EliminateTicketB, 1 },
|
||||||
|
{ CurrencyTypes.EliminateTicketC, 1 },
|
||||||
|
{ CurrencyTypes.EliminateTicketD, 1 }
|
||||||
|
},
|
||||||
|
UpdateTimeDict = new Dictionary<CurrencyTypes, DateTime>
|
||||||
|
{
|
||||||
|
{ CurrencyTypes.ActionPoint, DateTime.Parse("2024-04-26T19:29:12") },
|
||||||
|
{ CurrencyTypes.AcademyTicket, DateTime.Parse("2024-04-26T19:29:12") },
|
||||||
|
{ CurrencyTypes.ArenaTicket, DateTime.Parse("2024-04-26T19:29:12") },
|
||||||
|
{ CurrencyTypes.RaidTicket, DateTime.Parse("2024-04-26T19:29:12") },
|
||||||
|
{
|
||||||
|
CurrencyTypes.WeekDungeonChaserATicket,
|
||||||
|
DateTime.Parse("2024-04-26T19:29:12")
|
||||||
|
},
|
||||||
|
{
|
||||||
|
CurrencyTypes.WeekDungeonChaserBTicket,
|
||||||
|
DateTime.Parse("2024-04-26T19:29:12")
|
||||||
|
},
|
||||||
|
{
|
||||||
|
CurrencyTypes.WeekDungeonChaserCTicket,
|
||||||
|
DateTime.Parse("2024-04-26T19:29:12")
|
||||||
|
},
|
||||||
|
{
|
||||||
|
CurrencyTypes.SchoolDungeonATicket,
|
||||||
|
DateTime.Parse("2024-04-26T19:29:12")
|
||||||
|
},
|
||||||
|
{
|
||||||
|
CurrencyTypes.SchoolDungeonBTicket,
|
||||||
|
DateTime.Parse("2024-04-26T19:29:12")
|
||||||
|
},
|
||||||
|
{
|
||||||
|
CurrencyTypes.SchoolDungeonCTicket,
|
||||||
|
DateTime.Parse("2024-04-26T19:29:12")
|
||||||
|
},
|
||||||
|
{
|
||||||
|
CurrencyTypes.TimeAttackDungeonTicket,
|
||||||
|
DateTime.Parse("2024-04-26T19:29:12")
|
||||||
|
},
|
||||||
|
{ CurrencyTypes.MasterCoin, DateTime.Parse("2024-04-26T19:29:12") },
|
||||||
|
{ CurrencyTypes.WorldRaidTicketA, DateTime.Parse("2024-04-26T19:29:12") },
|
||||||
|
{ CurrencyTypes.WorldRaidTicketB, DateTime.Parse("2024-04-26T19:29:12") },
|
||||||
|
{ CurrencyTypes.WorldRaidTicketC, DateTime.Parse("2024-04-26T19:29:12") },
|
||||||
|
{ CurrencyTypes.ChaserTotalTicket, DateTime.Parse("2024-04-26T19:29:12") },
|
||||||
|
{
|
||||||
|
CurrencyTypes.SchoolDungeonTotalTicket,
|
||||||
|
DateTime.Parse("2024-04-26T19:29:12")
|
||||||
|
},
|
||||||
|
{ CurrencyTypes.EliminateTicketA, DateTime.Parse("2024-04-26T19:29:12") },
|
||||||
|
{ CurrencyTypes.EliminateTicketB, DateTime.Parse("2024-04-26T19:29:12") },
|
||||||
|
{ CurrencyTypes.EliminateTicketC, DateTime.Parse("2024-04-26T19:29:12") },
|
||||||
|
{ CurrencyTypes.EliminateTicketD, DateTime.Parse("2024-04-26T19:29:12") }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue