prozaker Posted January 21, 2009 Report Posted January 21, 2009 since the fusion site went down, and i cant edit my other post, im putting the source code here. its a functional bot, but needs adjustments. any help i can be contacted via a ?message proz good luck package twcore.bots.multibot.baseduel; import twcore.bots.MultiModule; import twcore.core.BotAction; import twcore.core.EventRequester; import twcore.core.events.FrequencyShipChange; import twcore.core.events.FrequencyChange; import twcore.core.events.Message; import twcore.core.events.PlayerEntered; import twcore.core.events.PlayerLeft; import twcore.core.events.PlayerDeath; import java.util.Collections; import java.util.HashSet; import java.util.Iterator; import java.util.Set; import twcore.core.game.Player; import twcore.core.util.ModuleEventRequester; import twcore.core.events.PlayerPosition; import java.util.Random; import java.util.TimerTask; //import java.util.Formatter; //import twcore.core.BotSettings; //import java.io.File; //import twcore.core.events.LoggedOn; //import java.util.Map; //import java.util.HashMap; //import twcore.core.*; //import java.util.Iterator; //import twcore.core.game.Arena; //import twcore.core.game.Ship; //import twcore.core.util.Tools; //import twcore.core.command.TWCoreException; //baseduel extension by Proz from SSCI FUSION, SSCU Redstar, and Extreme Games zones. public class baseduel extends MultiModule{ //playingFreqs contains the freqs challenged or in duel. public static HashSet <Short> playingFreqs = new HashSet<Short>(); //playingIds holds the name of the players challenged or currently dueling. public static HashSet <Short> playingIds = new HashSet<Short>(); //defines which bases are playing public static Set <Short> playingBases = Collections.synchronizedSet(new HashSet<Short>()); //has the freqs currently challenged public static HashSet <Short> chsFreqs = new HashSet<Short>(); //baseduel base object array BaseDuelBase base[] = new BaseDuelBase[13]; //challenge freqs control object chFreqs challenge[] = new chFreqs[13]; //bot frequency holder public Short botFreq; //TODO: should be changed to centerbase and generate a random position between the centerbase safe limits. public final int[] center = {512,416};//{500,510};//{514,398}; public final int[] graveyard={512,512};//{510,690};// public static HashSet <Short> idsAllowedToJoin = new HashSet<Short>(); //see int []center public final int[] centerBase={}; //center safe square, format is {x1,y1,x2,y2} public static final int[] centerSafe={503,505,520,520};//{503,682,520,697}; //{502,496,524,522}; /*all of the coordinates for the playing bases, if a new base needs to be added it should be done here. TODO:basecoord could be parameterized so it could be read from a file.*/ public static final int[][] basecoord={ /*{724,201,699,201}, {842,438,827,453}, {686,730,686,686}, {476,874,552,874}, {286,675,344,736}, {150,416,218,487}, {322,219,290,172}, {532,97,486,97} */ {482,127,543,127}, {650,154,709,212}, {769,277,850,262}, {841,403,841,488}, {818,656,863,656}, {725,800,752,800}, {492,855,531,855}, {303,820,271,774}, {191,647,144,610}, {94,446,195,446}, {140,297,245,243}, {342,157,357,191}, {570,736,454,736}}; public String botName; //total of bases available final int totalbases=(basecoord.length); public void requestEvents(ModuleEventRequester events) { events.request(this, EventRequester.PLAYER_DEATH); events.request(this, EventRequester.FREQUENCY_CHANGE); events.request(this, EventRequester.PLAYER_LEFT); events.request(this, EventRequester.FREQUENCY_SHIP_CHANGE); events.request(this, EventRequester.ARENA_JOINED); events.request(this, EventRequester.PLAYER_ENTERED); events.request(this, EventRequester.PLAYER_POSITION); events.request(this, EventRequester.PLAYER_LEFT); //events.request(this, EventRequester.MESSAGE); // req.request(EventRequester.PLAYER_LEFT); // req.request(EventRequester.PLAYER_DEATH); // req.request(EventRequester.PRIZE); // req.request(EventRequester.SCORE_UPDATE); // req.request(EventRequester.WEAPON_FIRED); // req.request(EventRequester.FREQUENCY_CHANGE); // req.request(EventRequester.FREQUENCY_SHIP_CHANGE); } public void init() { //m_botAction.setPlayerPositionUpdating( 100 ); m_botAction.sendArenaMessage("Base duel loaded with "+String.valueOf(totalbases)+" bases"); botName = m_botAction.getBotName(); /*TODO: read bot settings from a file. * Random generator = new Random(); int totalBases = m_botAction.getBotSettings().getInt("totalbases"); m_botAction.getBotSettings().getInt("base"+Integer.toString(baseNum)); String coreRoot = m_botAction.getGeneralSettings().getString( "Core Location"); BotSettings cfg = new BotSettings(coreRoot+"/twcore/bots/twbot/"+"baseduel.cfg"); int totalBases = cfg.getInt("totalbases"); **/ /* }*/ } /** * Handles players position information. */ public void handleEvent(PlayerPosition event){ // posX and posY stores the player's position. int posX=(event.getXLocation())/16; int posY=(event.getYLocation())/16; Short nameid=event.getPlayerID(); if(nameid!=null){ Short freq= m_botAction.getPlayer(nameid).getFrequency(); //this checks if player is in the graveyard. if ((posX>=centerSafe[0])&&(posX<=centerSafe[2])&& (posY>=centerSafe[1])&&(posY<=centerSafe[3])){ if (baseduel.playingIds.contains(nameid)==false){ m_botAction.warpTo(nameid, center[0], center[1]); } if (baseduel.playingIds.contains(nameid)==true){ checkOtherPositions(posX,posY,freq,nameid); } }else{ checkOtherPositions(posX,posY,freq,nameid); } } } /** * Handles messages. */ public void handleEvent( Message event ) { if(event.getMessageType() == Message.PUBLIC_MESSAGE) { String name = m_botAction.getPlayerName( event.getPlayerID() ); String message = event.getMessage(); if(name!=null){ handleCommand(name,message); } } if(event.getMessageType()==Message.PRIVATE_MESSAGE){ String name = m_botAction.getPlayerName( event.getPlayerID() ); String message = event.getMessage(); if(name!=null){ handlePrivateCommand(name,message); } } } /** * Triggered when a player enters the arena. */ public void handleEvent(PlayerEntered event) { Short nameid = event.getPlayerID(); if (baseduel.playingIds.contains(nameid)==false){ String name = m_botAction.getPlayerName(event.getPlayerID()); if(name!=null){ m_botAction.sendPrivateMessage(nameid,"Welcome to baseduel arena, for help, type !duelhelp"); } //m_botAction.sendPrivateMessage(nameid,"REMEMBER THIS IS STILL ON DEVELOPMENT FOR MORE INFO GO TO"); //m_botAction.sendPrivateMessage(nameid,"http://ss-fusion.com/phpBB3/viewtopic.php?f=3&t=1689 -Proz"); } } /** * This event is triggered when the player leaves the arena, in case the player left a duel, * his id is removed from the playing list. */ public void handleEvent(PlayerLeft event){ Short nameid = event.getPlayerID(); if (baseduel.playingIds.contains(nameid)){ if(nameid!=null){ baseduel.playingIds.remove(nameid); checkEmptyFreqs(nameid); removeIdFromDuel(nameid); } } } /** * This is triggered on a death, it might be the wrong way to handle it, i think im missing * handleling nulls when getting the player information. */ public void handleEvent(PlayerDeath event){ Short DeathId=event.getKilleeID(); Short killerId=event.getKillerID(); int i=0; for(i=0;i<totalbases;i++){ if(base[i]!=null){ if (base[i].hasId(DeathId)){ if(DeathId!=null&&killerId!=null){ base[i].addKill(killerId, DeathId); } break; } } } } /** * Triggered when the player changes ship and might change frequency. * in the event that the player might spec, it removes its name from the list, and * checks for empty frequencies. */ public void handleEvent(FrequencyShipChange event) { Short nameid = event.getPlayerID(); Short freq; int ship=m_botAction.getPlayer(Integer.valueOf(nameid)).getShipType(); freq = m_botAction.getPlayer(Integer.valueOf(nameid)).getFrequency(); if (baseduel.playingIds.contains(nameid)==false){ String name = m_botAction.getPlayerName(event.getPlayerID()); m_botAction.warpTo(name, center[0], center[1]); }else if(baseduel.playingIds.contains(nameid)==true&&ship==0){ playingIds.remove(nameid); if(nameid!=null){ checkEmptyFreqs(nameid); removeIdFromDuel(nameid); } } int j=0; for (j=0;j<challenge.length;j++){ if ((challenge[j]!=null)&&(ship==0)){ if(nameid!=null){ if (challenge[j].hasId(nameid)){ challenge[j].cancelDuel(nameid); break; } } } } } /** * If a player changes frequencies during a duel, it removes its name from the list, and checks for * empty frequencies. */ public void handleEvent(FrequencyChange event){ Short nameid = event.getPlayerID(); Short freq; freq = m_botAction.getPlayer(Integer.valueOf(nameid)).getFrequency(); if(playingFreqs.contains(freq)&&(idsAllowedToJoin.contains(nameid)==false)){ m_botAction.spec(nameid); m_botAction.spec(nameid); m_botAction.setFreq(nameid, botFreq); m_botAction.sendPrivateMessage(nameid, "Frequency is engaged in a duel and its currently locked"); }else{ if(playingIds.contains(nameid)){ playingIds.remove(nameid); m_botAction.warpTo(nameid, center[0], center[1]); } } //check if someone leaves a playing freq so playing bases and freqs are scrapped if(nameid!=null){ checkEmptyFreqs(nameid); removeIdFromDuel(nameid); } int j=0; for (j=0;j<challenge.length;j++){ if (challenge[j]!=null){ if (challenge[j].hasId(nameid)){ challenge[j].cancelDuel(nameid); break; } if(challenge[j].hasFreq(freq)){ challenge[j].cancelDuel3(); break; } } } } /** * when a player leaves a frequency, this verifies if the player's previous frequency is left empty. * if so, it will award the opposing freq a win. * @param nameid */ private void checkEmptyFreqs(Short nameid){ int x=0; for (x=0;x<totalbases;x++){ if (base[x]!=null){ base[x].emptyFreqCheck(nameid); } } } private void removeIdFromDuel(Short nameid){ int x=0; for (x=0;x<totalbases;x++){ if (base[x]!=null){ if(base[x].hasId(nameid)==true){ base[x].deleteid(nameid); } } } } /** * This is for smods and up, it makes the bot say something. (filters ! and * commands for security * reasons). * * @param name the player who initiated the message. * @param message the message that the bot will say. */ public void handlePrivateCommand( String name, String message){ if( (message.startsWith( "!say " )&& m_botAction.getOperatorList().isModerator(name))){ if((message.startsWith( "!say !" ))||(message.startsWith( "!say *" ))){ //m_botAction.warnPlayer(name, "No ! or * commands "); m_botAction.sendPrivateMessage(name, "command ignored"); }else{ message=message.substring(5, message.length()); m_botAction.sendPublicMessage(message); //m_botAction.sendSmartPrivateMessage("Proz", name+" " + message); } } if( (message.startsWith( "!j " )) || (message.startsWith( "!J " )) ){ Short nameId = (short)m_botAction.getPlayerID(name); Short joinFreq=null; try{ joinFreq = Short.valueOf(message.substring(3)); //m_botAction.sendPublicMessage(String.valueOf(joinFreq)); joinDuel(nameId, joinFreq); }catch (NumberFormatException e){ m_botAction.sendSmartPrivateMessage(name, "The command requires the number of a frequency to join ex: :"+ m_botAction.getBotName() +":!j 0"); } finally{ } } } public void joinDuel(Short id, Short freq){ int x=0; for (x=0;x<totalbases;x++){ if (base[x]!=null){ if(base[x].hasFreq(freq)==true){ base[x].addPlayer(id, freq); } } } } /** * * @param name the player who initiated the message * @param message */ public void handleCommand( String name, String message) { Short nameId = (short)m_botAction.getPlayerID(name); //this returns the scores for the current duels. if(message.toLowerCase().contentEquals("!s") || message.toLowerCase().contentEquals("!score")){ int x=0; boolean atLeastOneDuel=false; for (x=0;x<totalbases;x++){ if (base[x]!=null){ base[x].baseDuelInfo(nameId); atLeastOneDuel=true; } } if(atLeastOneDuel==false){ m_botAction.sendPrivateMessage(nameId, "No Current Duels"); } } //!r rejects a duel if(message.toLowerCase().contentEquals("!r")){ Short freq2=m_botAction.getPlayer(name).getFrequency(); int j=0; Short freq1; boolean freqFound=false; for (j=0;j<challenge.length;j++){ if (challenge[j]!=null){ if (challenge[j].hasFreq(freq2)){ freq1=challenge[j].otherFreq(freq2); challenge[j].cancelDuel2(); freqFound=true; m_botAction.sendOpposingTeamMessageByFrequency(freq1, "Duel rejected"); m_botAction.sendOpposingTeamMessageByFrequency(freq2, "Duel rejected"); break; } } } if(freqFound==false){ m_botAction.sendSmartPrivateMessage(name, "No pending Duels."); } } //accepts a duel and sends the frequency information to initbase method. if(message.toLowerCase().contentEquals("!a")){ Short freq2=m_botAction.getPlayer(name).getFrequency(); int j=0; Short freq1; boolean freqFound=false; for (j=0;j<challenge.length;j++){ if (challenge[j]!=null){ if (challenge[j].hasFreq2(freq2)){ freq1=challenge[j].acceptDuel(freq2); initBase(freq1,freq2); freqFound=true; m_botAction.sendOpposingTeamMessageByFrequency(freq1, "Duel Accepted"); m_botAction.sendOpposingTeamMessageByFrequency(freq2, "Duel Accepted"); break; } } } if(freqFound==false){ m_botAction.sendSmartPrivateMessage(name, "No pending Duels."); } } //Smods+ only, !clears, resets all of the duels data, this was for testing purposes, but may be used if someone gets stuck if( (message.startsWith( "!clear" )&& m_botAction.getOperatorList().isSmod(name))){ baseduel.playingIds.clear(); baseduel.playingFreqs.clear(); baseduel.playingBases.clear(); int x; for (x=0;x<totalbases;x++){ base[x]=null; } m_botAction.sendPrivateMessage(name, "all clear." ); m_botAction.sendPrivateMessage(name, name ); } //Sends messages with command and other information. if( message.startsWith( "!duelhelp" )){ String[] spam = {"!ch <name> - challenge someone to a duel", "!a - Used after your team is challenged to accept duel", "!r - Used after your team is challenged to reject duel", "!s - Shows current Duel scores", ":"+botName + ":!j <freq> - Joins an existing duel, where <freq> is the frequency to join", "(Baseduel Bot extension by Proz)"}; m_botAction.smartPrivateMessageSpam(name, spam); //Here is where challenges get handdled } else if( message.startsWith( "!ch")&&(message.length()>=5)) { String player2 = m_botAction.getFuzzyPlayerName(message.substring(4)); //get the challenged player name Short freq1=m_botAction.getPlayer(name).getFrequency();//get the first player's freq /* * TODO: i should get the bot's frequency in the beginning, */ botFreq = m_botAction.getPlayer(m_botAction.getBotName()).getFrequency(); Short nameId2 = (short)m_botAction.getPlayerID(player2);// gets the challenged players id if((player2!=null)){ //check that the player is present in the arena Short freq2=m_botAction.getPlayer(player2).getFrequency(); if ( (name!=player2)&& (freq1.equals(botFreq)==false)&& (m_botAction.getPlayer(name).getShipType() != 0)&& (baseduel.playingFreqs.contains(freq1)==false )&& (baseduel.playingIds.contains(nameId)==false)&& (player2!=null)&& (m_botAction.getPlayer(player2).getShipType() != 0)&& (baseduel.playingIds.contains(nameId2)==false)&& (freq2.equals(botFreq)==false)&& (player2.length()>0)&& (freq1.equals(freq2)==false)&& (baseduel.playingFreqs.contains(freq2)==false)&& (baseduel.chsFreqs.contains(freq1)==false)&& (baseduel.chsFreqs.contains(freq2)==false) ) { challenge(freq1,freq2); }else if ((m_botAction.getPlayer(name).getFrequency()==botFreq)|| (m_botAction.getPlayer(name).getShipType() == 0)){ m_botAction.sendSmartPrivateMessage(name, "Only non-speccing players may challenge."); }else if (baseduel.playingFreqs.contains(m_botAction.getPlayer(name).getFrequency())==true ){ m_botAction.sendSmartPrivateMessage(name, "You are already engaged in a duel."); }else if((baseduel.playingIds.contains((short)nameId2)==true) ||(playingIds.contains((short)nameId)==true)){ m_botAction.sendSmartPrivateMessage(name, "Only players not engaged in a duel may (be) challenged."); }else if (name==player2){ m_botAction.sendSmartPrivateMessage(name, "you cannot challenge yourself."); }else if(freq2.equals(botFreq)){ m_botAction.sendSmartPrivateMessage(name, "Cannot challenge speccing players."); }else if (baseduel.chsFreqs.contains(freq1)){ m_botAction.sendSmartPrivateMessage(name, "You already challenged someone else."); }else if (baseduel.chsFreqs.contains(freq2)){ m_botAction.sendSmartPrivateMessage(name, "Freq Already challenged."); }else if(freq1.equals(freq2)){ m_botAction.sendSmartPrivateMessage(name, "Cannot challenge players on your frequency."); }else { m_botAction.sendArenaMessage(botFreq.toString()+ " " + freq2.toString()); } } else { if (message.length()>=18){message=message.substring(0, 17)+"...";} m_botAction.sendSmartPrivateMessage(name, "Player "+(message.substring(4))+" not found."); } } } private void challenge (Short freq1, Short freq2){ String allF1PlayerNames=""; String allF2PlayerNames=""; String delimiter=""; chsFreqs.add(freq1); chsFreqs.add(freq2); Iterator<Player> i = BotAction.getBotAction().getPlayingPlayerIterator(); while( i.hasNext() ){ Player p = i.next(); if( freq1.equals(p.getFrequency())){ if (allF1PlayerNames.length()!=0){ delimiter=", "; }else{ delimiter=""; } allF1PlayerNames=allF1PlayerNames+delimiter+ p.getPlayerName(); } if (freq2.equals(p.getFrequency())){ if (allF2PlayerNames.length()!=0){ delimiter=", "; }else{ delimiter=""; } allF2PlayerNames=allF2PlayerNames+delimiter+ p.getPlayerName(); } } m_botAction.sendOpposingTeamMessageByFrequency(freq1, "Your team: "+allF1PlayerNames+" have challenged "+allF2PlayerNames+" they have 20 secs to accept"); m_botAction.sendOpposingTeamMessageByFrequency(freq2, "Your team: "+allF2PlayerNames+" has been challenged by "+allF1PlayerNames+" type !a to accept or !r to reject, duel will time out in 20 seconds "); int j=0; for (j=0;j<challenge.length;j++){ if (challenge[j]==null){ challenge[j]= new chFreqs(); challenge[j].addfreqs(freq1, freq2, j); break; } } } public void initBase(Short freq1, Short freq2 ){ Random randomgen = new Random(); Short x = (short)randomgen.nextInt(totalbases); while (baseduel.playingBases.contains(x)==true){ if (x!=0){ x=0; } x++; } if(baseduel.playingBases.size()==totalbases){ m_botAction.sendOpposingTeamMessageByFrequency(freq1, "no" + " bases available" + "for duel - please try again when a base is available."); m_botAction.sendOpposingTeamMessageByFrequency(freq2, "no" + " bases available" + "for duel"); }else if(baseduel.playingBases.contains(x)==false){ base[x]= new BaseDuelBase(); baseduel.playingBases.add(x); base[x].matchStart(x,freq1,freq2); } } public void initBase(Short freq1, Short freq2, Short BaseNum ){ if (baseduel.playingBases.contains(BaseNum)==true){ m_botAction.sendOpposingTeamMessageByFrequency(freq1, "Base is already in use "); }else{ if(baseduel.playingBases.size()==totalbases){ m_botAction.sendOpposingTeamMessageByFrequency(freq1, "no" + " bases available" + "for duel - please try again when a base is available."); m_botAction.sendOpposingTeamMessageByFrequency(freq2, "no" + " bases available" + "for duel"); }else if(baseduel.playingBases.contains(BaseNum)==false){ base[BaseNum]= new BaseDuelBase(); baseduel.playingBases.add(BaseNum); base[BaseNum].matchStart(BaseNum,freq1,freq2); } } } public void checkOtherPositions(int posX,int posY, Short freq, Short nameid){ int num=playerIsBaseSafe(nameid,posX,posY); if(num>=0){ if (base[num]!=null){ base[num].baseSafe((short)freq, posX, posY); } } if(checkFreqIsSafe((short)freq)==true){ num=CheckForFreq(freq); if((num!=-1)){ if (base[num].playingStatus()==true){ base[num].centerSafe(freq); } return; } } } public boolean checkFreqIsSafe(Short freq){ Short freqTotal=(short)(m_botAction.getFrequencySize(freq)); Short playersInSafe=0; Iterator<Player> i = m_botAction.getPlayingPlayerIterator(); while( i.hasNext() ){ Player p = i.next(); if(freq.equals(p.getFrequency())){ if ((p.getXTileLocation()>=centerSafe[0])&&(p.getXTileLocation()<=centerSafe[2])&& (p.getYTileLocation()>=centerSafe[1])&&(p.getYTileLocation()<=centerSafe[3])){ playersInSafe++; if (playersInSafe.equals(freqTotal)){ playersInSafe=0; return true; } } } } playersInSafe=0; return false; } /** * * @param playerId is the id of the player * @param x is the xtile position of the player * @param y is the ytile position of the player * @return */ public int playerIsBaseSafe(int playerId, int x, int y){ int i=0; for (i=0;i<totalbases;i++){ if (((x==basecoord[i][0])&&(y==basecoord[i][1]))|| ((x==basecoord[i][2])&&(y==basecoord[i][3]))) { return i; } } return -1; } /** * Returns the number of the base that contains the frequency. * If it returns -1 then no base has frequency * @param freq * @return */ public Short CheckForFreq(Short freq){ int x=0; for (x=0;x<totalbases;x++){ if (base[x]!=null){ if(base[x].hasFreq((short)freq)==true){ if (base[x].playingStatus()==true){ return (short)x; } else{ return -1; } } } } return -1; } /** * Removes the playing id's of the players in the duel. * removes both frequencies. * sets the baseduel base object to null. * and warps freqs to center. * @param num ( number of the base to kill.) * @param f1 * @param f2 */ public void killBase(int num, Short f1, Short f2){ base[num].deleteIds(); playingBases.remove((short)num); playingFreqs.remove(f1); playingFreqs.remove(f2); base[num]=null; m_botAction.warpFreqToLocation(Integer.valueOf(f1),center[0], center[1]); m_botAction.warpFreqToLocation(Integer.valueOf(f2),center[0], center[1]); } /** * * @param num Challenge number * @param f1 Frequency that initiated the challange * @param f2 Frequency that was challenged */ public void killchallenge(int num, Short f1, Short f2){ challenge[num]=null; chsFreqs.remove(f1); chsFreqs.remove(f2); } public String[] getHelpMessages() { String[] help = { "!duelhelp - this message.", "!help - same message as duel help", "!score - lists all current duels and their score", "!ch <name> - challenge someone to a baseduel for 5 rounds ", "BaseDuel extension version 0.9.1 - by Proz" }; return help; } public void cancel() { } public boolean isUnloadable(){ return true; } public String[] getModHelpMessage() { String[] help = { //"!manual - Toggles a few automatic hosting features on or off (default is on)", }; return help; } /** * Baseduelbase holds the information relative to a duel occurring in a base. * @author Proz * */ public class BaseDuelBase { //Num holds the base number private int Num; private int Round=1; private boolean playing=false; private boolean matchOver=false; private boolean matchStarted=false; private Short freq1; private Short freq2; private int freq1size; private int freq1InitSize; private int freq2size; private int freq2InitSize; private String allF1PlayerNames=""; private String allF2PlayerNames=""; private HashSet <Short> freq1Players = new HashSet<Short>(); private HashSet <Short> freq2Players = new HashSet<Short>(); private int freq1wins=0; private int freq2wins=0; private int freq1Losses; private int freq2Losses; private int safe[]={0,0,0,0}; private int f1x; private int f1y; private int f2x; private int f2y; private boolean freq1InSafe; private boolean freq2InSafe; playerData pdata[]= new playerData[30]; //TimerTask updateState; public class playerData{ private int id; private int kills; private int deaths; private int spree; private String name; public void initPlayerData(int newid){ id=newid; kills=0; deaths=0; spree=0; name = BotAction.getBotAction().getPlayerName(id); } public int getId(){ return id; } public int getKills(){ return kills; } public void addKill(){ kills++; spree++; checkSpree(); } public int getDeaths(){ return deaths; } public void addDeath(){ deaths++; spree=0; } public void checkSpree(){ if (spree%10==0&&spree!=0){ BotAction.getBotAction().sendArenaMessage( name + " is on a " + String.valueOf(spree)+" spree"); } } } public void baseDuelInfo(Short playerID){ getCurrentNames(); if(allF1PlayerNames.length()>19){ allF1PlayerNames=allF1PlayerNames.substring(0, 20)+"..."; } if(allF2PlayerNames.length()>19){ allF2PlayerNames=allF2PlayerNames.substring(0, 20)+"..."; } if(playerID!=null){ m_botAction.sendPrivateMessage(playerID,allF1PlayerNames+" ("+ String.valueOf(freq1wins)+" points) vs " + allF2PlayerNames+ " ("+ String.valueOf(freq2wins)+" points)"+ ", base "+ String.valueOf(Num+1) ); } //m_botAction.sendPrivateMessage(playerID,"-"); } public boolean playingStatus(){ return playing; } /** * will return if match has started. * @return true if match is started */ public boolean matchStarted(){ return matchStarted; } public void matchStart(int baseNum, Short f1, Short f2){ Num=baseNum; freq1=f1; freq2=f2; freq1size=m_botAction.getFrequencySize(freq1); freq2size=m_botAction.getFrequencySize(freq2); freq1InitSize=freq1size; freq2InitSize=freq2size; //pdata=new playerData[freq1size+freq2size]; int i=0; for(i=0;i<=3;i++){ safe[i]=baseduel.basecoord[Num][i]; } getIds(freq1,freq2); warpSetup(); matchStarted=true; //roundStart(); } private void warpSetup(){ f1x=safe[0]; f1y=safe[1]; f2x=safe[2]; f2y=safe[3]; BotAction.getBotAction().warpFreqToLocation(Integer.valueOf(freq1), f1x, f1y); BotAction.getBotAction().warpFreqToLocation(Integer.valueOf(freq2), f2x, f2y); playing=true; } final public void roundStart(){ //delay=false; playing=false; shipReset(); Round++; if(Round%2==1){ f1x=safe[0]; f1y=safe[1]; f2x=safe[2]; f2y=safe[3]; // TimerTask nextRound = new TimerTask() { // public void run() { m_botAction.warpFreqToLocation(Integer.valueOf(freq1), f1x, f1y); m_botAction.warpFreqToLocation(Integer.valueOf(freq2), f2x, f2y); // } //};BotAction.getBotAction().scheduleTask(nextRound, 4000); //BotAction.getBotAction().warpFreqToLocation(Integer.valueOf(freq1), f1x, f1y); //BotAction.getBotAction().warpFreqToLocation(Integer.valueOf(freq2), f2x, f2y); }else{ f2x=safe[0]; f2y=safe[1]; f1x=safe[2]; f1y=safe[3]; //TimerTask nextRound = new TimerTask() { //public void run() { m_botAction.warpFreqToLocation(Integer.valueOf(freq1), f1x, f1y); m_botAction.warpFreqToLocation(Integer.valueOf(freq2), f2x, f2y); // } //};BotAction.getBotAction().scheduleTask(nextRound, 4000); } centerCheck(); freq2InSafe=false; freq1InSafe=false; if(freq1wins==5||freq2wins==5){ matchEnd(); return; } setPlayingTrue(); //playing=true; } private void shipReset(){ Iterator<Player> i = BotAction.getBotAction().getPlayingPlayerIterator(); while( i.hasNext() ){ Player p = i.next(); if( freq1.equals(p.getFrequency())||freq2.equals(p.getFrequency())){ BotAction.getBotAction().shipReset(p.getPlayerID()); } } } public boolean hasId(int id){ boolean has=false; if((freq1Players.contains((short)id))||(freq2Players.contains((short)id))){ has=true; } return has; } public boolean hasFreq(Short freq){ if ( (freq1.equals(freq)) || (freq2.equals(freq)) ){ return true; }else{ return false; } } public void centerSafe(Short freq){ if (this.playingStatus()==true){ if(freq1.equals(freq)){ freq1InSafe=true; } if(freq2.equals(freq)){ freq2InSafe=true; } roundStart(); //updateState= new updateState(this); //m_botAction.scheduleTask(updateState,3000); //BotAction.getBotAction().scheduleTask(updateState, 4000); //roundDelay(Num); //m_botAction.scheduleTask(roundDelay, delayms) //roundDelay(); } } private void setPlayingTrue(){ TimerTask nextRound = new TimerTask() { public void run() { playing=true; } };BotAction.getBotAction().scheduleTask(nextRound, 5000); } public void emptyFreqCheck(Short nameid){ Short freq=-1; if (freq1Players.contains(nameid)){ freq=freq1; freq1size=freq1size-1; if(freq1size==0){ matchEnd(freq); } } if (freq2Players.contains(nameid)){ freq=freq2; freq2size=freq2size-1; if(freq2size==0){ matchEnd(freq); } } } private void centerCheck(){ if (freq1InSafe==true&&freq2InSafe==true){ roundEnd("both"); } if (freq1InSafe==true&&freq2InSafe==false){ roundEnd(freq1); } if (freq2InSafe==true&&freq1InSafe==false){ roundEnd(freq2); } } public void baseSafe(Short freq, int posX, int posY){ if (this.playingStatus()==true){ if(freq1.equals(freq)&&posX==f2x&&posY==f2y){ BotAction.getBotAction().warpFreqToLocation(freq2,graveyard[0],graveyard[1]); } if(freq2.equals(freq)&&posX==f1x&&posY==f1y){ BotAction.getBotAction().warpFreqToLocation(freq1,graveyard[0],graveyard[1]); } } } public void addPlayer(Short id, Short freq){ if(id!=null){ if(freq.equals(freq1)){ if(freq1InitSize!=freq1size){ freq1size++; idsAllowedToJoin.add(id); m_botAction.setShip(id, 1); m_botAction.setFreq(id, freq1); playingIds.add(id); idsAllowedToJoin.remove(id); addPlayerData(id); //allF1PlayerNames = allF1PlayerNames + " " + m_botAction.getPlayerName(id); m_botAction.sendSmartPrivateMessage(m_botAction.getPlayerName(id), "You joined frequency"+String.valueOf(freq1) ); m_botAction.warpTo(id, graveyard[0], graveyard[1]); }else{ m_botAction.sendSmartPrivateMessage(m_botAction.getPlayerName(id), "No spots available."); } }else if(freq.equals(freq2)){ if(freq2InitSize!=freq2size){ freq2size++; idsAllowedToJoin.add(id); m_botAction.setShip(id, 1); m_botAction.setFreq(id, freq2); playingIds.add(id); idsAllowedToJoin.remove(id); addPlayerData(id); //allF2PlayerNames = allF2PlayerNames + " " + m_botAction.getPlayerName(id); m_botAction.sendSmartPrivateMessage(m_botAction.getPlayerName(id), "You joined frequency"+String.valueOf(freq2) ); m_botAction.warpTo(id, graveyard[0], graveyard[1]); }else{ m_botAction.sendSmartPrivateMessage(m_botAction.getPlayerName(id), "No spots available."); } } } } private void addPlayerData(int id){ int x=0; playerData tempData; for(x=0;x<pdata.length;x++){ if(pdata[x]==null){ pdata[x] = new playerData(); pdata[x].initPlayerData(id); break; } } } private void getCurrentNames(){ allF1PlayerNames=""; allF2PlayerNames=""; String delimiter; Iterator<Player> i = BotAction.getBotAction().getPlayingPlayerIterator(); while( i.hasNext() ){ Player p = i.next(); if( freq1.equals(p.getFrequency())){ if (allF1PlayerNames.length()!=0){ delimiter=", "; }else{ delimiter=""; } allF1PlayerNames=allF1PlayerNames+delimiter+ p.getPlayerName(); } if (freq2.equals(p.getFrequency())){ if (allF2PlayerNames.length()!=0){ delimiter=", "; }else{ delimiter=""; } allF2PlayerNames=allF2PlayerNames+delimiter+ p.getPlayerName(); } } } private void getIds(Short freq1, Short freq2){ baseduel.playingFreqs.add(freq1); baseduel.playingFreqs.add(freq2); int j=0; String delimiter; Iterator<Player> i = BotAction.getBotAction().getPlayingPlayerIterator(); while( i.hasNext() ){ Player p = i.next(); if( freq1.equals(p.getFrequency())){ freq1Players.add(p.getPlayerID()); baseduel.playingIds.add(p.getPlayerID()); pdata[j] = new playerData(); pdata[j].initPlayerData(p.getPlayerID()); j++; if (allF1PlayerNames.length()!=0){ delimiter=", "; }else{ delimiter=""; } allF1PlayerNames=allF1PlayerNames+delimiter+ p.getPlayerName(); } if (freq2.equals(p.getFrequency())){ freq2Players.add(p.getPlayerID()); baseduel.playingIds.add(p.getPlayerID()); pdata[j] = new playerData(); pdata[j].initPlayerData(p.getPlayerID()); j++; if (allF2PlayerNames.length()!=0){ delimiter=", "; }else{ delimiter=""; } allF2PlayerNames=allF2PlayerNames+delimiter+ p.getPlayerName(); } } } public void addKill(int killerId, int DeathId){ int pos1=getPlayerDataPosition(killerId); int pos2=getPlayerDataPosition(DeathId); pdata[pos1].addKill(); pdata[pos2].addDeath(); } public int getPlayerDataPosition(Integer id){ int pos=0; for(pos=0;pos<pdata.length;pos++){ if(pdata[pos].getId()==id&&pdata[pos]!=null&&id!=null){ return pos; } } return -1; } public void deleteid(Short id){ try{ if (freq1Players.contains(id)){ freq1Players.remove(id); } if (freq2Players.contains(id)){ freq2Players.remove(id); } } finally{ } } public void deleteIds(){ baseduel.playingFreqs.remove(freq1); baseduel.playingFreqs.remove(freq2); Iterator<Player> i = BotAction.getBotAction().getPlayingPlayerIterator(); while( i.hasNext() ){ Player p = i.next(); if(freq1.equals(p.getFrequency())){ baseduel.playingIds.remove(p.getPlayerID()); } if (freq2.equals(p.getFrequency())){ baseduel.playingIds.remove(p.getPlayerID()); } } } /** * Tells the roundEnd() the frequency that lost, by adding a lost and adds the opposing team a win * @param freqLost */ public void roundEnd(String s){ if(s=="both"){ freq1wins++; freq2wins++; BotAction.getBotAction().sendOpposingTeamMessageByFrequency(freq1,"Both teams are tied with "+String.valueOf(freq1wins)); BotAction.getBotAction().sendOpposingTeamMessageByFrequency(freq2,"Both teams are tied with "+String.valueOf(freq2wins)); } } public void roundEnd(Short freqLost){ if (freqLost.equals(freq1)){ freq1Losses++; freq2wins++; }else if (freqLost.equals(freq2)){ freq2Losses++; freq1wins++; } if(freq1wins>freq2wins){ BotAction.getBotAction().sendOpposingTeamMessageByFrequency(freq1, "Your team is winning with: "+ String.valueOf(freq1wins)+" and your opponent is losing with: "+ String.valueOf(freq2wins)); BotAction.getBotAction().sendOpposingTeamMessageByFrequency(freq2, "Your team is losing with: "+ String.valueOf(freq2wins)+" and your opponent leads with: "+ String.valueOf(freq1wins)); }else if (freq2wins>freq1wins){ BotAction.getBotAction().sendOpposingTeamMessageByFrequency(freq2, "Your team is winning with: "+ String.valueOf(freq2wins)+" and your opponent is losing with: "+ String.valueOf(freq1wins)); BotAction.getBotAction().sendOpposingTeamMessageByFrequency(freq1, "Your team is losing with: "+ String.valueOf(freq1wins)+" and your opponent is winning with: "+ String.valueOf(freq2wins)); }else{ BotAction.getBotAction().sendOpposingTeamMessageByFrequency(freq1,"Both teams are tied with "+String.valueOf(freq1wins)); BotAction.getBotAction().sendOpposingTeamMessageByFrequency(freq2,"Both teams are tied with "+String.valueOf(freq2wins)); } //Round++; //roundStart(); } private String[] printStats(){ int pos; int j=0; Integer id; int k=0; Integer statsSize=freq1size+freq2size+20; Short[] freqsOrder= new Short[2]; //Short winningFreq; //Short losserFreq; if(freq1wins>freq2wins){ freqsOrder[0]=freq1; freqsOrder[1]=freq2; }else{ freqsOrder[0]=freq2; freqsOrder[1]=freq1; } if(freq1size==0){ freqsOrder[0]=freq2; freqsOrder[1]=freq1; }else if(freq2size==0){ freqsOrder[0]=freq1; freqsOrder[1]=freq2; } String playerStats[]= new String[statsSize]; for(k=0;k<2;k++){ if (k==0){ playerStats[j]="|------(-- Winners --)----- |"; j++; playerStats[j]="| Name K D |"; j++; playerStats[j]="|-------------------------- |"; j++; }else{ playerStats[j]="|------(-- Losers --)------ |"; j++; } Iterator<Player> i = BotAction.getBotAction().getPlayingPlayerIterator(); while( i.hasNext() ){ Player p = i.next(); if( freqsOrder[k].equals(p.getFrequency())){ id=Integer.valueOf(p.getPlayerID()); pos=getPlayerDataPosition(id); if(id!=null){ playerStats[j]=String.format("| %1$-16s %2$3d %3$3d |", BotAction.getBotAction().getPlayerName(id), pdata[pos].getKills(), pdata[pos].getDeaths() ); } if (id!=null){ j++; } } } } playerStats[j]="|___________________________|"; int x=0; Integer statsSize2=statsSize; for (x=0;x<statsSize;x++){ if(playerStats[x]==null){ statsSize2--; } } x=0; String playerStats2[]= new String[statsSize2]; for (x=0;x<statsSize2;x++){ playerStats2[x]=playerStats[x]; } return playerStats2; } private void matchEnd(Short freq){ BotAction.getBotAction().arenaMessageSpam(printStats()); if(freq==freq1){ BotAction.getBotAction().sendArenaMessage(allF2PlayerNames+" ("+freq2wins+ " Points)" + " defeated "+ allF1PlayerNames+" ("+freq1wins+" Points)"); BotAction.getBotAction().sendArenaMessage("no players left on "+ allF1PlayerNames +"'s frequency" ); } if(freq==freq2){ BotAction.getBotAction().sendArenaMessage(allF1PlayerNames+" ("+freq1wins+ " Points)" + " defeated "+ allF2PlayerNames+" ("+freq2wins+" Points)"); BotAction.getBotAction().sendArenaMessage("no players left on "+ allF2PlayerNames +"'s frequency" ); } baseduel.this.killBase(Num, freq1, freq2); } private void matchEnd(){ matchOver=true; BotAction.getBotAction().arenaMessageSpam(printStats()); if(allF1PlayerNames.length()>19){ allF1PlayerNames=allF1PlayerNames.substring(0, 20)+"..."; } if(allF2PlayerNames.length()>19){ allF2PlayerNames=allF2PlayerNames.substring(0, 20)+"..."; } if(freq1wins>freq2wins){ BotAction.getBotAction().sendArenaMessage(allF1PlayerNames+" ("+freq1wins+ " Points)" + " defeated "+ allF2PlayerNames+" ("+freq2wins+" Points)"); } if(freq2wins>freq1wins){ BotAction.getBotAction().sendArenaMessage(allF2PlayerNames+" ("+freq2wins+ " Points)" + " defeated "+ allF1PlayerNames+" ("+freq1wins+" Points)"); } baseduel.this.killBase(Num, freq1, freq2); } public String[] getHelpMessages() { String[] help = { "!duelhelp - this message.", "!ch <name> - challenge someone to a baseduel for 5 rounds.", "!s or !score - Shows current duel scores." }; return help; } public void cancel() { } } public class chFreqs { public Short f1=0; public Short f2=0; private TimerTask removefrq; public int chNum; private HashSet <Short> freq1Players = new HashSet<Short>(); private HashSet <Short> freq2Players = new HashSet<Short>(); public void addfreqs(Short freq1,Short freq2, int num){ // String anf1, String anf2 f1=freq1; f2=freq2; chNum=num; Iterator<Player> i = BotAction.getBotAction().getPlayingPlayerIterator(); while( i.hasNext() ){ Player p = i.next(); if( freq1.equals(p.getFrequency())){ freq1Players.add(p.getPlayerID()); } if (freq2.equals(p.getFrequency())){ freq2Players.add(p.getPlayerID()); } } removefrq = new TimerTask() { public void run() { baseduel.chsFreqs.remove(f1); baseduel.chsFreqs.remove(f2); m_botAction.sendOpposingTeamMessageByFrequency(f1,"Duel timed out"); m_botAction.sendOpposingTeamMessageByFrequency(f2,"Duel timed out"); baseduel.this.killchallenge(chNum, f1, f2); } };BotAction.getBotAction().scheduleTask(removefrq, 20000); } public boolean hasId(Short id){ boolean has=false; if(freq1Players.contains(id)||freq2Players.contains(id)){ has=true; } return has; } public void deleteFreqs(Short f1){ } public boolean hasFreq(Short freq){ if ((f1.equals(freq))||(f2.equals(freq))){ return true; } return false; } public boolean hasFreq2(Short freq){ if (f2.equals(freq)){ return true; } return false; } public Short acceptDuel(Short freq){ if (f2.equals(freq)){ baseduel.this.killchallenge(chNum, f1, f2); removefrq.cancel(); return f1; } return -1; } public Short otherFreq(Short freq){ if (f2.equals(freq)){ return f1; } return -1; } public void cancelDuel(int id){ m_botAction.sendOpposingTeamMessageByFrequency(f1, "Duel cancelled "+ m_botAction.getPlayerName(id)+" Changed freq" ); m_botAction.sendOpposingTeamMessageByFrequency(f2, "Duel cancelled "+ m_botAction.getPlayerName(id)+" Changed freq" ); m_botAction.sendSmartPrivateMessage(m_botAction.getPlayerName(id), "Duel cancelled you changed freq."); removefrq.cancel(); baseduel.this.killchallenge(chNum, f1, f2); } public void cancelDuel2(){ removefrq.cancel(); baseduel.this.killchallenge(chNum, f1, f2); } public void cancelDuel3(){ m_botAction.sendOpposingTeamMessageByFrequency(f1,"Duel cancelled freqs changed"); m_botAction.sendOpposingTeamMessageByFrequency(f2, "Duel cancelled freqs changed"); removefrq.cancel(); baseduel.this.killchallenge(chNum, f1, f2); } } public class PlayerInfo{ private Short frequency; private int id; private String name; private int ship; private boolean playingStatus; } }
Recommended Posts