extasie80 Posted April 26, 2019 Posted April 26, 2019 (edited) Good evening, I'm looking for a code to reward players every hour I use a version of L2j I'm looking for a free code Edited April 26, 2019 by extasie80
0 Rootware Posted April 26, 2019 Posted April 26, 2019 package custom.RewardForTimeOnline; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ScheduledFuture; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.l2jserver.gameserver.ThreadPoolManager; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.model.events.Containers; import com.l2jserver.gameserver.model.events.EventType; import com.l2jserver.gameserver.model.events.impl.character.player.OnPlayerLogin; import com.l2jserver.gameserver.model.events.impl.character.player.OnPlayerLogout; import com.l2jserver.gameserver.model.events.listeners.ConsumerEventListener; import com.l2jserver.gameserver.model.quest.Quest; /** * @author LifeGame32 */ public final class RewardForTimeOnline extends Quest { static final Logger LOG = LoggerFactory.getLogger(RewardForTimeOnline.class); // Enable/Disable static final boolean LOAD = true; final Map<Integer, PlayerHolder> players; final List<ItemHolder> rewardItem; // unique var DB(for saving), Item ID, Amount, time in milliseconds, save the last rewarded time. private void addItem() { rewardItem.add(new ItemHolder("rfto_1", 57, 50000, 30 * 1000, false)); rewardItem.add(new ItemHolder("rfto_2", 57, 150000, 60 * 1000, true)); rewardItem.add(new ItemHolder(getVar(), 57, 150000, 60 * 1000, true)); } private String getVar() { return getClass().getSimpleName() + "_" + rewardItem.size(); } private final class PlayerHolder { final L2PcInstance player; final List<RewardTask> rewardTask = new ArrayList<>(); public PlayerHolder(L2PcInstance player) { this.player = player; } public final PlayerHolder startRewardTask() { for (ItemHolder item : rewardItem) { rewardTask.add(new RewardTask(this, item)); } return this; } public final void onPlayerLogout() { for (RewardTask t : rewardTask) { t.onPlayerLogout(); } } } private final class RewardTask implements Runnable { private final PlayerHolder ph; private final ItemHolder item; private ScheduledFuture<?> task = null; private long lastTime; public RewardTask(PlayerHolder playerHolder, ItemHolder item) { this.ph = playerHolder; this.item = item; this.lastTime = System.currentTimeMillis(); long initialDelay; if (item.isSaveTime) { initialDelay = ph.player.getVariables().getLong(item.var, 0); if ((initialDelay == 0) || (initialDelay > item.time)) { initialDelay = item.time; } } else { initialDelay = item.time; } this.task = ThreadPoolManager.getInstance().scheduleGeneralAtFixedRate(this, initialDelay, item.time); } @Override public void run() { if ((ph.player == null) || (ph.player.getClient() == null) || ph.player.getClient().isDetached()) { return; } if (ph.player.isOnline()) { if (item.isSaveTime) { ph.player.getVariables().set(item.var, 0); } lastTime = System.currentTimeMillis(); ph.player.addItem(RewardForTimeOnline.class.getSimpleName(), item.id, item.count, null, true); } } public final void onPlayerLogout() { stopTask(); if (item.isSaveTime) { ph.player.getVariables().set(item.var, (item.time - (System.currentTimeMillis() - lastTime))); } } public final void stopTask() { if (task != null) { task.cancel(false); task = null; } } } private final class ItemHolder { final String var; final int id; final long count; final long time; final boolean isSaveTime; public ItemHolder(String var, int id, long count, long time, boolean isSaveTime) { this.var = var; this.id = id; this.count = count; this.time = time; this.isSaveTime = isSaveTime; } } public RewardForTimeOnline() { super(-1, RewardForTimeOnline.class.getSimpleName(), "custom/RewardForTimeOnline"); Containers.Global().addListener(new ConsumerEventListener(Containers.Global(), EventType.ON_PLAYER_LOGIN, (OnPlayerLogin event) -> onPlayerLogin(event), this)); Containers.Global().addListener(new ConsumerEventListener(Containers.Global(), EventType.ON_PLAYER_LOGOUT, (OnPlayerLogout event) -> onPlayerLogout(event), this)); players = new ConcurrentHashMap<>(); rewardItem = new ArrayList<>(); addItem(); } private final void onPlayerLogin(OnPlayerLogin event) { PlayerHolder task = players.get(event.getActiveChar().getObjectId()); if (task == null) { players.put(event.getActiveChar().getObjectId(), new PlayerHolder(event.getActiveChar()).startRewardTask()); } } private final void onPlayerLogout(OnPlayerLogout event) { PlayerHolder task = players.remove(event.getActiveChar().getObjectId()); if (task != null) { task.onPlayerLogout(); } } public static void main(String[] args) { if (LOAD) { new RewardForTimeOnline(); } LOG.info("{}: load {}.", RewardForTimeOnline.class.getSimpleName(), LOAD); } } Original share here.
0 SweeTs Posted April 26, 2019 Posted April 26, 2019 @Rootware Da heck.. So much code for such a little addon. Hint, take a look on gametime task, you can see the 'take a break' message after an hour. You can follow the logic of the task. Add player on login, store time and then check if hour passed.
0 Rootware Posted April 26, 2019 Posted April 26, 2019 @SweeTs the man wanted already maded the free code. He didn't asked for write for him. Free is not meant good.
Question
extasie80
Good evening,
I'm looking for a code to reward players every hour
I use a version of L2j
I'm looking for a free code
Edited by extasie805 answers to this question
Recommended Posts