Jump to content
  • 0

Idea


Williams

Question

I have in mind to create a new VIP system, like Bronze VIP, Silver VIP and Gold VIP. Any ideas for using the same isVip variable for the 3 functions? Because I don't want to have to create isVipBronze, isVipPrata and isVipOuro and neither 3 tasks because I will save the statuses in the characters' memo. To using java 11.

Link to comment
Share on other sites

13 answers to this question

Recommended Posts

  • 0

Make PremiumLevel enum like:

public enum PremiumLevel
{
	NONE(0),
	BRONZE(1),
	SILVER(2),
	GOLD(3);
	
	public static final PremiumLevel[] VALUES = values();
	
	private final int _id;
	
	private PremiumLevel(int id)
	{
		_id = id;
	}
	
	public int getId()
	{
		return _id;
	}
	
	public boolean isGreater(PremiumLevel premiumLevel)
	{
		return getId() > premiumLevel.getId();
	}
	
	public boolean isLesser(PremiumLevel premiumLevel)
	{
		return getId() < premiumLevel.getId();
	}
}

 

And manage following this states as you want. The more elegant solution don't find.

Link to comment
Share on other sites

  • 0
14 minutes ago, Rootware said:

Make PremiumLevel enum like:



public enum PremiumLevel
{
	NONE(0),
	BRONZE(1),
	SILVER(2),
	GOLD(3);
	
	public static final PremiumLevel[] VALUES = values();
	
	private final int _id;
	
	private PremiumLevel(int id)
	{
		_id = id;
	}
	
	public int getId()
	{
		return _id;
	}
	
	public boolean isGreater(PremiumLevel premiumLevel)
	{
		return getId() > premiumLevel.getId();
	}
	
	public boolean isLesser(PremiumLevel premiumLevel)
	{
		return getId() < premiumLevel.getId();
	}
}

 

And manage following this states as you want. The more elegant solution don't find.

good idea I did more or less like this, define the variable by name I find it easier.

 

https://imgur.com/a/qrM1yPP

 

template

 

https://imgur.com/a/R9paVUO

 

Enum

 

https://imgur.com/a/JQGd960

Edited by Williams
Link to comment
Share on other sites

  • 0

Pointless, IMHO.

 

final PremiumLevel premiumLevel = PremiumLevel.VALUES[levelId];

 

or

 

final PremiumLevel premiumLevel = Enum.valueOf(PremiumLevel.class "GOLD");

 

or add into PremiumLevel enum one more method:

 

	public static PremiumLevel getPremiumLevel(int levelId)
	{
		for (PremiumLevel bit : VALUES)
			if (bit.getId() == levelId)
				return bit;
			
		return NONE;
	}

 

and use

 

final PremiumLevel premiumLevel = PremiumLevel.getPremiumLevel(levelId);

 

Edited by Rootware
Typos.
Link to comment
Share on other sites

  • 0

Why not an abstract class?

 

public abstract class VipStatus
{
	private final long _endTime;
	
	public VipStatus(long endTime)
	{
		_endTime = endTime;
	}
	
	public long getEndTime()
	{
		return _endTime;
	}
	
	public abstract double getExpBonusRate();
	public abstract double getSpoilBonusRate();
	public abstract double getAdenaBonusRate();
}

 

 

Then your classes

 

public class VipBronze extends VipStatus
{
	public VipBronze(long endTime)
	{
		super(endTime);
	}
	
	@Override
	public double getExpBonusRate()
	{
		return 1.2;
	}
	
	@Override
	public double getSpoilBonusRate()
	{
		return 1.7;
	}
	
	@Override
	public double getAdenaBonusRate()
	{
		return 2.5;
	}
}

 

 

So in conclusion, your player instance will have only VipStatus variable and you wont mess with enums and checks for what vip status the player have

Link to comment
Share on other sites

  • 0
3 minutes ago, melron said:

Why not an abstract class?

 


public abstract class VipStatus
{
	private final long _endTime;
	
	public VipStatus(long endTime)
	{
		_endTime = endTime;
	}
	
	public long getEndTime()
	{
		return _endTime;
	}
	
	public abstract double getExpBonusRate();
	public abstract double getSpoilBonusRate();
	public abstract double getAdenaBonusRate();
}

 

 

Then your classes

 


public class VipBronze extends VipStatus
{
	public VipBronze(long endTime)
	{
		super(endTime);
	}
	
	@Override
	public double getExpBonusRate()
	{
		return 1.2;
	}
	
	@Override
	public double getSpoilBonusRate()
	{
		return 1.7;
	}
	
	@Override
	public double getAdenaBonusRate()
	{
		return 2.5;
	}
}

 

 

So in conclusion, your player instance will have only VipStatus variable and you wont mess with enums and checks for what vip status the player have

I found the model using xml easier to edit doing with abstract class would have to configure by config that way it gives me more work to create countless configs for each type

  • Like 1
Link to comment
Share on other sites

  • 0
5 minutes ago, Williams said:

I found the model using xml easier to edit doing with abstract class would have to configure by config that way it gives me more work to create countless configs for each type

There's nothing that can't be done. You can use xml to parse your values just like you did with the other model.

Link to comment
Share on other sites

  • 0

Let's start with basic Java things.

 

Enum has build in ordinal that act as ID. So all this:

public enum PremiumLevel
{
	NONE(0),
	BRONZE(1),
	SILVER(2),
	GOLD(3);
	
	public static final PremiumLevel[] VALUES = values();
	
	private final int _id;
	
	private PremiumLevel(int id)
	{
		_id = id;
	}
	
	public int getId()
	{
		return _id;
	}
	
	public boolean isGreater(PremiumLevel premiumLevel)
	{
		return getId() > premiumLevel.getId();
	}
	
	public boolean isLesser(PremiumLevel premiumLevel)
	{
		return getId() < premiumLevel.getId();
	}
}

 

is pointless since you can use the PremiumLevel.BRONZE.ordinal();

 

Also this is more useless than the getId()

 

public static final PremiumLevel[] VALUES = values();

 

since enum is initialized once. So you can use Premium.values();

 

Also to the other guy who suggest class implementation. Not wrong but just to get values without any other option is needless. The whole code can be written using enum but in a proper way:

 

/*
 * Copyright (C) 2004-2021 L2J Server
 * This file is part of L2J Server.
 * L2J Server is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 * L2J Server is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * General Public License for more details.
 * You should have received a copy of the GNU General Public License
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
 */
package com.l2jserver.gameserver.datatables;

/**
 * @author Kara`
 */
public enum Premium
{
	NONE
	{
		@Override
		public double getExperienceMultiplier()
		{
			return 1;
		}

		@Override
		public double getSkillPointMultiplier()
		{
			return 1;
		}
	},
	BRONZE
	{
		@Override
		public double getExperienceMultiplier()
		{
			return 1.15;
		}

		@Override
		public double getSkillPointMultiplier()
		{
			return 1.15;
		}
	};

	public abstract double getExperienceMultiplier();

	public abstract double getSkillPointMultiplier();
}

 

You can also use configs inside those and avoid static values. Nonetheless it's up to you to decide base on your need. If you're thinking of extending the code and add functionality, avoid enum and go with interface classes. 

 

If you're thinking of just using 3-4 multiplier then enum is good and easily stored. You can create a field in database "premium_level" and store the ordinal of enum.

 

Once player login you can restore by using Premium.values()[rs.getInt("premium_level")]

Edited by Kara
  • Upvote 1
Link to comment
Share on other sites

  • 0

when the real java dev comes to kick ass.:notbadn:

 

On to the topic, why you think people will buy all this levels of VIP in first place?

PS: @Tryskell what is your opinion you have also years of experience in java

  • Sad 1
Link to comment
Share on other sites

  • 0
1 hour ago, Nightw0lf said:

when the real java dev comes to kick ass.:notbadn:

 

On to the topic, why you think people will buy all this levels of VIP in first place?

PS: @Tryskell what is your opinion you have also years of experience in java

Tryskell would just rename Premium to PremiumType and commit.

Disclaimer: This was a joke, do not carpet bomb me.

  • Sad 1
  • Upvote 1
Link to comment
Share on other sites

  • 0

Thanks for the tips I will use Enum even because it is simpler and I will make my code cleaner. I don't have the same experience as you, but I wrote my enum like this.

 

package net.sf.l2j.gameserver.enums.actors;

import java.util.NoSuchElementException;

/**
 * @author Williams
 *
 */
public enum VipType
{
	NONE("None"),
	BRONZE("Bronze"),
	SILVER("Silver"),
	GOLD("Gold");
	
	public static final VipType[] VALUES = values();
	
	private String _name;
	
	private VipType(String name)
	{
		_name = name;
	}
	
	public String getName()
	{
		return _name;
	}
	
	public static VipType valueOfXml(String name)
	{
		name = name.intern();
		for (VipType type : VALUES)
		{
			if (type.getName().equals(name))
				return type;
		}
		throw new NoSuchElementException("Unknown name '" + name + "' for enum VipType");
	}
}

 

to add the VIP I did it that way 

 


	public void addVip(int duration, VipType type)
	{
		VipTaskManager.getInstance().add(this);
		setVip(true);
		
		long remainingTime = getMemos().getLong(type.name(), 0);
		if (remainingTime > 0)
		{
			getMemos().set(type.name(), remainingTime + TimeUnit.DAYS.toMillis(duration));
			sendMessage("Dear player, your Vip status has been extended by " + duration + " day(s).");
		}
		else
			getMemos().set(type.name(), System.currentTimeMillis() + TimeUnit.DAYS.toMillis(duration));

		setVip(type);
		sendMessage(getName() + " now you are a Vip, your duration is " + duration + " day(s).");	
	}
	

 

Edited by Williams
Link to comment
Share on other sites

  • 0
56 minutes ago, Williams said:

Thanks for the tips I will use Enum even because it is simpler and I will make my code cleaner. I don't have the same experience as you, but I wrote my enum like this.

 


package net.sf.l2j.gameserver.enums.actors;

import java.util.NoSuchElementException;

/**
 * @author Williams
 *
 */
public enum VipType
{
	NONE("None"),
	BRONZE("Bronze"),
	SILVER("Silver"),
	GOLD("Gold");
	
	public static final VipType[] VALUES = values();
	
	private String _name;
	
	private VipType(String name)
	{
		_name = name;
	}
	
	public String getName()
	{
		return _name;
	}
	
	public static VipType valueOfXml(String name)
	{
		name = name.intern();
		for (VipType type : VALUES)
		{
			if (type.getName().equals(name))
				return type;
		}
		throw new NoSuchElementException("Unknown name '" + name + "' for enum VipType");
	}
}

 

to add the VIP I did it that way 

 



	public void addVip(int duration, VipType type)
	{
		VipTaskManager.getInstance().add(this);
		setVip(true);
		
		long remainingTime = getMemos().getLong(type.name(), 0);
		if (remainingTime > 0)
		{
			getMemos().set(type.name(), remainingTime + TimeUnit.DAYS.toMillis(duration));
			sendMessage("Dear player, your Vip status has been extended by " + duration + " day(s).");
		}
		else
			getMemos().set(type.name(), System.currentTimeMillis() + TimeUnit.DAYS.toMillis(duration));

		setVip(type);
		sendMessage(getName() + " now you are a Vip, your duration is " + duration + " day(s).");	
	}
	

 

 

You're rap*ng Java like 99% of the forum.

You simply don't even read a single line from what i wrote in my last comment that intended for you.

 

Experience and laziness are different things. If you don't care of improving your self, go ahead use that s*t code. 

Link to comment
Share on other sites

  • 0
10 minutes ago, Kara said:

 

You're rap*ng Java like 99% of the forum.

You simply don't even read a single line from what i wrote in my last comment that intended for you.

 

Experience and laziness are different things. If you don't care of improving your self, go ahead use that s*t code. 

 

I understood the way you spoke, I just did not understand the way to restore the values of the enum when the player comes into play

Link to comment
Share on other sites

Guest
This topic is now closed to further replies.


×
×
  • Create New...