Jump to content
  • 0

Make .res Use Only Once In 5 Minutes


Question

Posted

hello there can you help me make this when people die when they type .res and after that he must wait 5 minutes till use it again there is code

Index: java/com/l2j/frozen/gameserver/handler/VoicedCommandHandler.java
===================================================================
--- java/com/l2j/frozen/gameserver/handler/VoicedCommandHandler.java
+++ java/com/l2j/frozen/gameserver/handler/VoicedCommandHandler.java

    import com.l2jfrozen.gameserver.handler.voicedcommandhandlers.Wedding;
 + import com.l2jfrozen.gameserver.handler.voicedcommandhandlers.Res;



		if(Config.ALLOW_ONLINE_VIEW)
		{
			registerVoicedCommandHandler(new Online());
		}

	+      if(Config.RES_COMMAND)
	+     {
	+	       registerVoicedCommandHandler(new Res());
        +     }  

Index: java/com/l2j/frozen/Config.java
===================================================================
--- java/com/l2j/frozen/Config.java
+++ java/com/l2j/frozen/Config.java


        public static String FARM1_CUSTOM_MESSAGE;
	public static String FARM2_CUSTOM_MESSAGE;
	public static String PVP1_CUSTOM_MESSAGE;
	public static String PVP2_CUSTOM_MESSAGE;
     + public static boolean RES_COMMAND;
     + public static int RES_ITEM;
     + public static int RES_COUNT;


	FARM1_CUSTOM_MESSAGE = L2JFrozenSettings.getProperty("Farm1CustomMeesage", "You have been teleported to Farm Zone 1!");
	FARM2_CUSTOM_MESSAGE = L2JFrozenSettings.getProperty("Farm2CustomMeesage", "You have been teleported to Farm Zone 2!");
	PVP1_CUSTOM_MESSAGE = L2JFrozenSettings.getProperty("PvP1CustomMeesage", "You have been teleported to PvP Zone 1!");
	PVP2_CUSTOM_MESSAGE = L2JFrozenSettings.getProperty("PvP2CustomMeesage", "You have been teleported to PvP Zone 2!");
 +	RES_COMMAND = Boolean.parseBoolean(L2JFrozenSettings.getProperty("ResCommandEnabled", "False"));
 +	RES_ITEM  = Integer.parseInt(L2JFrozenSettings.getProperty("ResItem", "57"));
 +	RES_COUNT = Integer.parseInt(L2JFrozenSettings.getProperty("ResAmount", "1"));

Index: java/config/l2jmods.properties
===================================================================
--- java/config/functions/l2jfrozen.properties
+++ java/config/functions/l2jfrozen.properties


# Allows user to use command .online
# Displays The Number of The Players That are Currently Online.
# Default : False
AllowOnlineView = False

#Allow user to use command.res
#Resurrects a corpse. In addition, restores about 30 percent of Exp.
ResCommandEnabled = False
#Id of Item Need When user use .res command
ResItem = 57

#Ammount Of Item.
ResAmount = 1

Index: java/net/sf/l2j/gameserver/handler/voicedcommandhandlers/Res.java
===================================================================
--- java/com/l2j/frozen/gameserver/handler/voicedcommandhandlers/Res.java
+++ java/net/sf/l2j/gameserver/handler/voicedcommandhandlers/Res.java

/* This program 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 2, or (at your option)
 * any later version.
 *
 * This program 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, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
 * 02111-1307, USA.
 *
 * http://www.gnu.org/copyleft/gpl.html
 */
package com.l2jfrozen.gameserver.handler.voicedcommandhandlers;

import com.l2jfrozen.Config;
import com.l2jfrozen.gameserver.handler.IVoicedCommandHandler;
import com.l2jfrozen.gameserver.managers.CastleManager;
import com.l2jfrozen.gameserver.model.actor.instance.L2PcInstance;


public class Res implements IVoicedCommandHandler
{
    private static final String[] VOICED_COMMANDS = { "res" };

    public boolean useVoicedCommand(String command, L2PcInstance activeChar, String target)
    {   
        if (command.equalsIgnoreCase("res"))
        {
              if (!activeChar.isAlikeDead())
              {
                 activeChar.sendMessage("You cannot be ressurected while alive.");
                 return false;
              }
           if(activeChar.getClan() != null
                      && CastleManager.getInstance().getCastleByOwner(activeChar.getClan()) != null
                      && CastleManager.getInstance().getCastleByOwner(activeChar.getClan()).getSiege().getIsInProgress())
                {
            	  activeChar.sendMessage("You cannot use this feature during Siege.");
                  return false;
                }
           if(activeChar.isInOlympiadMode())
           {
              activeChar.sendMessage("You cannot use this feature during olympiad.");
             return false;
           }
           if(activeChar.getInventory().getItemByItemId(Config.RES_ITEM) == null)
           {
              activeChar.sendMessage("You Cant Use This Command without Some Items.");
             return false;
           }
           
           
           
              activeChar.sendMessage("You have been ressurected!");
              activeChar.getInventory().destroyItemByItemId("RessSystem", Config.RES_ITEM, Config.RES_COUNT, activeChar, activeChar.getTarget());
              activeChar.doRevive();
              activeChar.getInventory().updateDatabase();
              activeChar.broadcastUserInfo();
              activeChar.sendMessage("Item has dissapeared! Thank you!");
        }
       return true;
    }
    public String[] getVoicedCommandList()
    {
        return VOICED_COMMANDS;
    }
}

Recommended Posts

  • 0
Posted

I think best option for you would be to create

Map<Integer, Long> commandUsages = new ConcurrentHashMap<>();

When somebody is trying to use the command you should check

long currentTime = System.currentTimeMillis();
if(commandUsages.getOrDefault(activeChar.getObjectId(), 0L) > currentTime)
{
activeChar.sendMessage("You cannot use it so often!");
return false;
} 

When somebody successfully used the command you should add

commandUsages.put(activeChar.getObjectId(), currentTime + TimeUnit.MINUTES.toMillis(5L));
  • 0
Posted


 

public boolean useVoicedCommand(String command, L2PcInstance activeChar, String target)

{

+ Map<Integer, Long> commandUsages = new ConcurrentHashMap<>();

if (command.equalsIgnoreCase("res"))

{

if (!activeChar.isAlikeDead())

{

activeChar.sendMessage("You cannot be ressurected while alive.");

return false;

}

if(activeChar.getClan() != null

&& CastleManager.getInstance().getCastleByOwner(activeChar.getClan()) != null

&& CastleManager.getInstance().getCastleByOwner(activeChar.getClan()).getSiege().getIsInProgress())

{

activeChar.sendMessage("You cannot use this feature during Siege.");

return false;

}

if(activeChar.isInOlympiadMode())

{

activeChar.sendMessage("You cannot use this feature during olympiad.");

return false;

}

if(activeChar.getInventory().getItemByItemId(Config.RES_ITEM) == null)

{

activeChar.sendMessage("You Cant Use This Command without Some Items.");

return false;

}

+ if(commandUsages.getOrDefault(activeChar.getObjectId(), 0L) > currentTime)

+ {

+ activeChar.sendMessage("You cannot use it so often!");

+ return false;

+ }

 

+ commandUsages.put(activeChar.getObjectId(), currentTime + TimeUnit.MINUTES.toMillis(5L));

activeChar.sendMessage("You have been ressurected!");

activeChar.getInventory().destroyItemByItemId("RessSystem", Config.RES_ITEM, Config.RES_COUNT, activeChar, activeChar.getTarget());

activeChar.doRevive();

activeChar.getInventory().updateDatabase();

activeChar.broadcastUserInfo();

activeChar.sendMessage("Item has dissapeared! Thank you!");

}

return true;

}

  • 0
Posted

errors :C

Map<Integer, Long> commandUsages = new ConcurrentHashMap<>();
if(commandUsages.getOrDefault(activeChar.getObjectId(), 0L) > currentTime)
commandUsages.put(activeChar.getObjectId(), currentTime + TimeUnit.MINUTES.toMillis(5L))
  • 0
Posted (edited)
	
    public boolean useVoicedCommand(String command, L2PcInstance activeChar, String target)
    {   
+        Map<Integer, Long> commandUsages = new ConcurrentHashMap<>();
        blablalabla
    }

No...

Map must be outside the Method.

 

You are getting errors because you didn't import Map and ConcurrentHashMap classes

Edited by vampir
  • 0
Posted (edited)

Or he can create a boolean like _isLocked which is set to true while usage and a task to make it false after the time is up :P

Edited by SweeTs
  • 0
Posted
+        Map<Integer, Long> commandUsages = new ConcurrentHashMap<>();   
public boolean useVoicedCommand(String command, L2PcInstance activeChar, String target)
{

if (command.equalsIgnoreCase("res"))
{
if (!activeChar.isAlikeDead())
{
activeChar.sendMessage("You cannot be ressurected while alive.");
return false;
}
if(activeChar.getClan() != null
&& CastleManager.getInstance().getCastleByOwner(activeChar.getClan()) != null
&& CastleManager.getInstance().getCastleByOwner(activeChar.getClan()).getSiege().getIsInProgress())
{
     activeChar.sendMessage("You cannot use this feature during Siege.");
return false;
}
if(activeChar.isInOlympiadMode())
{
activeChar.sendMessage("You cannot use this feature during olympiad.");
return false;
}
if(activeChar.getInventory().getItemByItemId(Config.RES_ITEM) == null)
{
activeChar.sendMessage("You Cant Use This Command without Some Items.");
return false;
}
+            if(commandUsages.getOrDefault(activeChar.getObjectId(), 0L) > currentTime)
+            {
+            activeChar.sendMessage("You cannot use it so often!");
+            return false;
+            }
                
+                commandUsages.put(activeChar.getObjectId(), currentTime + TimeUnit.MINUTES.toMillis(5L));
activeChar.sendMessage("You have been ressurected!");
activeChar.getInventory().destroyItemByItemId("RessSystem", Config.RES_ITEM, Config.RES_COUNT, activeChar, activeChar.getTarget());
activeChar.doRevive();
activeChar.getInventory().updateDatabase();
activeChar.broadcastUserInfo();
activeChar.sendMessage("Item has dissapeared! Thank you!");
}
return true;
}

And click CTRL,SHIFT and O at the same time.

  • 0
Posted

Or he can create a boolean like _isLocked which is set to true while usage and a task to make it false after the time is up :P

You still would have to make a Long with saved time of usage so that's a lot worse solution than simple Map, if i understood it right.

  • 0
Posted (edited)

You still would have to make a Long with saved time of usage so that's a lot worse solution than simple Map, if i understood it right.

Not rly. There is no need to save anything or so. The lock is fired on the command use, _isLocked(true); and threadpool (scheduleGeneral) is launched after 5min to set it false.

 

Comparing the currentTime is also a good idea.

Edited by SweeTs
  • 0
Posted (edited)

private long lastUsed = 0;
public void useShit()
{
     if (System.currentTimeMillis() - lastUsed < "needed time to wait in milliseconds")
    {
         // send message like "You must wait blabla before using this shit again."
         return;
    }
    
    stuff();
    shits();
    useshits();
    lastUsed = System.currentTimeMillis();
}

Why you need to use the f*cking Map?

 

EDIT:

Oh, now I understand. You don't want to use that stuff with L2PcInstance.

But I suggest you to change your mind and put that long variable in L2PcInstance. :D

Using Map in this situation is not recommended. 

Edited by DarthVader
Guest
This topic is now closed to further replies.
×
×
  • Create New...