L2JMobius

Classic Interlude Repurposing TvT Event

pipipopo · 4 · 2733

Offline pipipopo

  • Knight
  • ***
    • Posts: 80
I'm not a fan of TvT event in general. I mean whole game is a TvT event. That's the whole point of clans and sieges. IMHO there is no need for TvT event on a healthy server. However I think Olympiad is bad as well even though it's retail. Why? Because it incentivizes feeding, has terrible balance and is limited to end-game characters. It also plays a role in destroying game's economy. This is why I decided to make a new Olympiad!

Small description:
You can register at any time.
Registration costs X amount of Y.
You have multiple choices to register with X, or 10X, or 100X, or 1000X, or whatever.
When someone else registers with the same amount of Y as you, event Olympiad starts.
Winner gets all the Y(essentially double the amount of chosen registration price).
Loser gets nothing.
Also there are 5 brackets: 36-39, 40-51, 52-60, 61-75, 76-80. Player can only be matched with another player in same bracket.

This way A: event can be used on low rate servers. B: It can not be farmed and has no negative effect on servers economy. C: Different balance on different levels is good for diversifying game and making "Olympiad" fun for less popular/overpowered characters.

For these reasons I decided to cannibalize TvT event and create Olympiad Event. Anyone has seen something like this? Done something like this? I'm not sure where to start although it seems pretty easy. Essentially all I have to do is start new TvT event as soon as old one ends and set player limit to 2. Add cost and prize accordingly. This would work perfectly except I want to have concurrent matches. And I want to have brackets for different levels. And I want to have multiple registration prices. Any ideas how I should go about this? Where to look and what to look for? I'm gonna get it done one way or another but any help will be appreciated.


Offline pipipopo

  • Knight
  • ***
    • Posts: 80
Code: [Select]
// Create instances.
manager = InstanceManager.getInstance();
template = manager.getInstanceTemplate(INSTANCE_ID);
for (int i = 0; i < ARENA_COUNT; i++)
{
PVP_WORLD.add(manager.createInstance(template, null));
}
still returns one world. Is this how it works? One world per manager?


Online Mobius

  • Distinguished King
  • *****
    • Posts: 16047
One instance template means one instance.
If you want more, you should figure how to add more instance ids.


Offline pipipopo

  • Knight
  • ***
    • Posts: 80
One instance template means one instance.
If you want more, you should figure how to add more instance ids.
Yeah figured it out. I wasn't initializing the list of instances :D I got it half working but decided it's just easier to extend Olympiad instead. Got it working somewhat. Registration takes X, winner gets two X. Right now I'm adding CompetitionTypes to have multiple brackets like this:
Code: [Select]
case "register1":
{
if (player.getLevel() < 36) // avoid exploits
{
htmltext = "OlyManager-noNoble.html";
}
else if (Olympiad.getInstance().getNoblePoints(player) <= 0)
{
htmltext = "OlyManager-noPoints.html";
}
else if (!player.isInventoryUnder80(false))
{
player.sendPacket(SystemMessageId.UNABLE_TO_PROCESS_THIS_REQUEST_UNTIL_YOUR_INVENTORY_S_WEIGHT_AND_SLOT_COUNT_ARE_LESS_THAN_80_PERCENT_OF_CAPACITY);
}
else
{
if (player.getExpertiseLevel() == 1)
{
OlympiadManager.getInstance().registerNoble(player, CompetitionType.D_GRADE_1);
}
else if (player.getExpertiseLevel() == 2)
{
OlympiadManager.getInstance().registerNoble(player, CompetitionType.C_GRADE_1);
}
else if (player.getExpertiseLevel() == 3)
{
OlympiadManager.getInstance().registerNoble(player, CompetitionType.B_GRADE_1);
}
else if (player.getExpertiseLevel() == 4)
{
OlympiadManager.getInstance().registerNoble(player, CompetitionType.A_GRADE_1);
}
else if (player.getExpertiseLevel() == 5)
{
OlympiadManager.getInstance().registerNoble(player, CompetitionType.S_GRADE_1);
}
}
break;
}
case "register2":
{
if (player.getLevel() < 36) // avoid exploits
{
htmltext = "OlyManager-noNoble.html";
}
else if (Olympiad.getInstance().getNoblePoints(player) <= 0)
{
htmltext = "OlyManager-noPoints.html";
}
else if (!player.isInventoryUnder80(false))
{
player.sendPacket(SystemMessageId.UNABLE_TO_PROCESS_THIS_REQUEST_UNTIL_YOUR_INVENTORY_S_WEIGHT_AND_SLOT_COUNT_ARE_LESS_THAN_80_PERCENT_OF_CAPACITY);
}
else
{
if (player.getExpertiseLevel() == 1)
{
OlympiadManager.getInstance().registerNoble(player, CompetitionType.D_GRADE_2);
}
else if (player.getExpertiseLevel() == 2)
{
OlympiadManager.getInstance().registerNoble(player, CompetitionType.C_GRADE_2);
}
else if (player.getExpertiseLevel() == 3)
{
OlympiadManager.getInstance().registerNoble(player, CompetitionType.B_GRADE_2);
}
else if (player.getExpertiseLevel() == 4)
{
OlympiadManager.getInstance().registerNoble(player, CompetitionType.A_GRADE_2);
}
else if (player.getExpertiseLevel() == 5)
{
OlympiadManager.getInstance().registerNoble(player, CompetitionType.S_GRADE_2);
}
}
break;
}
case "register3":
{
if (player.getLevel() < 36) // avoid exploits
{
htmltext = "OlyManager-noNoble.html";
}
else if (Olympiad.getInstance().getNoblePoints(player) <= 0)
{
htmltext = "OlyManager-noPoints.html";
}
else if (!player.isInventoryUnder80(false))
{
player.sendPacket(SystemMessageId.UNABLE_TO_PROCESS_THIS_REQUEST_UNTIL_YOUR_INVENTORY_S_WEIGHT_AND_SLOT_COUNT_ARE_LESS_THAN_80_PERCENT_OF_CAPACITY);
}
else
{
if (player.getExpertiseLevel() == 1)
{
OlympiadManager.getInstance().registerNoble(player, CompetitionType.D_GRADE_3);
}
else if (player.getExpertiseLevel() == 2)
{
OlympiadManager.getInstance().registerNoble(player, CompetitionType.C_GRADE_3);
}
else if (player.getExpertiseLevel() == 3)
{
OlympiadManager.getInstance().registerNoble(player, CompetitionType.B_GRADE_3);
}
else if (player.getExpertiseLevel() == 4)
{
OlympiadManager.getInstance().registerNoble(player, CompetitionType.A_GRADE_3);
}
else if (player.getExpertiseLevel() == 5)
{
OlympiadManager.getInstance().registerNoble(player, CompetitionType.S_GRADE_3);
}
}
break;
}
case "register4":
{
if (player.getLevel() < 36) // avoid exploits
{
htmltext = "OlyManager-noNoble.html";
}
else if (Olympiad.getInstance().getNoblePoints(player) <= 0)
{
htmltext = "OlyManager-noPoints.html";
}
else if (!player.isInventoryUnder80(false))
{
player.sendPacket(SystemMessageId.UNABLE_TO_PROCESS_THIS_REQUEST_UNTIL_YOUR_INVENTORY_S_WEIGHT_AND_SLOT_COUNT_ARE_LESS_THAN_80_PERCENT_OF_CAPACITY);
}
else
{
if (player.getExpertiseLevel() == 1)
{
OlympiadManager.getInstance().registerNoble(player, CompetitionType.D_GRADE_4);
}
else if (player.getExpertiseLevel() == 2)
{
OlympiadManager.getInstance().registerNoble(player, CompetitionType.C_GRADE_4);
}
else if (player.getExpertiseLevel() == 3)
{
OlympiadManager.getInstance().registerNoble(player, CompetitionType.B_GRADE_4);
}
else if (player.getExpertiseLevel() == 4)
{
OlympiadManager.getInstance().registerNoble(player, CompetitionType.A_GRADE_4);
}
else if (player.getExpertiseLevel() == 5)
{
OlympiadManager.getInstance().registerNoble(player, CompetitionType.S_GRADE_4);
}
}
break;
}
It's working as it should. Problem I have though is I can't figure out how to check which CompetitionType is in OlympiadGameNormal.java where I want to add rewards accordingly.

I want to replace this:
rewardParticipant(_playerTwo.getPlayer(), Config.ALT_OLY_WINNER_REWARD);
With something like this:
Code: [Select]
if(CompetitionType == X_GRADE_1)
{
rewardParticipant(_playerTwo.getPlayer(), Config.ALT_OLY_WINNER_REWARD_1);
}else if(CompetitionType == X_GRADE_2)
{
rewardParticipant(_playerTwo.getPlayer(), Config.ALT_OLY_WINNER_REWARD_2);
}
else if(CompetitionType == X_GRADE_3)
{
rewardParticipant(_playerTwo.getPlayer(), Config.ALT_OLY_WINNER_REWARD_3);
}
else if(CompetitionType == X_GRADE_4)
{
rewardParticipant(_playerTwo.getPlayer(), Config.ALT_OLY_WINNER_REWARD_4);
}

Is there a way to check CompetitionType of current match in OlympiadGameNormal.java? or maybe other way I could pass this info from OlyManager.java to OlympiadGameNormal.java?

edit:
FOUND IT!
Code: [Select]
if(getType() == CompetitionType.A_GRADE_1) {
etcetcetc
}