2013-08-01 10 views
6

Sto creando un radar basato su testo per Minecraft. Se un giocatore arriva entro 20 blocchi da te, dirà in chat. A partire da ora, spam la chat. Come posso ottenere di scrivere solo per chattare su quel giocatore UNA VOLTA? Anche se non giochi, dovrebbe essere facile da capire.Rileva il rilevatore di prossimità solo quando l'oggetto entra nel campo, non quando si muove nel raggio d'azione

if (Camb.radar) 
{ 
    for (Entity e: (List <Entity>) mc.theWorld.loadedEntityList) 
    { 
    if (e instanceof EntityPlayer) 
    { 
     EntityPlayer player = (EntityPlayer) e; 
     if (player == mc.thePlayer || mc.thePlayer.getDistanceToEntity(e) > 20.0) 
     continue; 
     mc.thePlayer.addChatMessage("\2479[CAMB] \247e" + player.getEntityName() + " has entered your 20 block radius!"); //Write to chat, only want this line done once for every player 
    } 
    } 
} 
+0

Vorresti che solo ping voi una volta che entrano di nuovo il raggio di rilevamento, e solo ping se ne vanno un reinserimento? – StephenTG

+0

1. Hai mai sentito parlare di una 'variabile booleana '? 2. Cosa succede se il giocatore va via per 30 minuti e poi torna indietro? Il giocatore non dovrebbe essere avvisato allora? –

+1

Se c'è un tipo di MovementListener per i giocatori che puoi usare, ti suggerirei di spostare l'intero bit di codice lì dentro. – Vulcan

risposta

15

Avrete bisogno di tenere traccia di quando il giocatore lascia il campo e impostare un flag, in modo da sapere quando sono transizione da "out of range" a "in linea". Potrebbe anche voler aggiungere un timer in modo da poter avvisare solo una volta ogni N secondi.

2

Se si crea una classe PlayerData, può contenere una hashmap di nomi di gioco mappati ai booleani. Dai a ciascun giocatore un oggetto PlayerData e poi quando qualcuno entra nel raggio di quel giocatore, puoi attivare/disattivare il suo booleano.

public class PlayerData { 
    public Player thePlayer; 
    public HashMap<String,boolean> inRadius = new HashMap<String,boolean>(); 

    public PlayerData(Player thePlayer) { 
     this.thePlayer = thePlayer; 
    } 

    public void checkRadius(P Entity player) { 
    /**function that checks radius and if a new player is there, notify thePlayer*/ 
     if(inRadius.get(player.getEntityName()) == true || thePlayer == player || thePlayer.getDistanceToEntity(player) > 20.0) return; 
     else { 
     thePlayer.addChatMessage("whatever you want to say"); 
     inRadius.put(player.getEntityName(), true); 
     } 
     for(Iterator<String> key=inRadius.keySet().Iterator();key.hasNext()) { 
     String name = key.next(); 
     /**Check to see if that player is still within 20 meters. If not, set value to false*/ 
     /** also be careful to check if player is online*/ 
     } 
    } 

} 
2

Si potrebbe provare a creare un elenco o una matrice di giocatori vicini e aggiungerli a quell'elenco quando si trovano entro 20 blocchi. Quando trovi un'entità all'interno dell'intervallo, controlla se è presente nella tua lista. In caso contrario, notifica e aggiungilo all'elenco, in caso affermativo, gioco :)

Per rimuovere elementi dall'elenco, controllare le entità nell'elenco e confrontarle con la posizione dei giocatori. Se sono fuori portata, rimuoverli. Potrebbe essere necessario che ciò avvenga in un ciclo separato.

0

È necessario memorizzare al di fuori del metodo che è già stato segnalato al giocatore. A Map è perfetto per questo. Ancora meglio un WeakHashMap nel caso in cui non si vuole far trapelare quelli Entities

private final Set<EntityPlayer> playersInRange = Collections 
     .newSetFromMap(new WeakHashMap<EntityPlayer, Boolean>()); 

void onMove() { 
    if (Camb.radar) { 
     for (Entity e : (List<Entity>) mc.theWorld.loadedEntityList) { 
      if (e instanceof EntityPlayer) { 
       EntityPlayer player = (EntityPlayer) e; 

       if (player == mc.thePlayer || mc.thePlayer.getDistanceToEntity(e) > 20.0) { 
        // make sure player is (no longer) in set 
        playersInRange.remove(player); 
        continue; 
       } 

       if (!playersInRange.contains(player)) { 
        playersInRange.add(player); 
        mc.thePlayer.addChatMessage("\2479[CAMB] \247e" + player.getEntityName() 
          + " has entered your 20 block radius!"); 
       } 
      } 
     } 
    } 
} 

Si potrebbe anche memorizzare un tempo con loro per re-avviso ogni volta X.

private static final long WAIT_BETWEEN_ALERTS = 30000; 
private final WeakHashMap<EntityPlayer, Long> map = new WeakHashMap<EntityPlayer, Long>(); 
void onMove() { 
    if (Camb.radar) { 
     for (Entity e : (List<Entity>) mc.theWorld.loadedEntityList) { 
      if (e instanceof EntityPlayer) { 
       EntityPlayer player = (EntityPlayer) e; 

       if (player == mc.thePlayer || mc.thePlayer.getDistanceToEntity(e) > 20.0) { 
        // clear alerts 
        map.remove(player); 
        continue; 
       } 

       Long lastTimeAlerted = map.get(player); 
       long minimumLastAlert = System.currentTimeMillis() - WAIT_BETWEEN_ALERTS; 

       if (lastTimeAlerted == null || lastTimeAlerted < minimumLastAlert) { 
        map.put(player, System.currentTimeMillis()); 
        mc.thePlayer.addChatMessage("\2479[CAMB] \247e" + player.getEntityName() 
          + " has entered your 20 block radius!"); 
       } // else, already alerted recently. 
      } 
     } 
    } 
} 
0

Aggiungere un flag booleano per EntityPlayer detected con metodi getter/setter.

All'interno del vostro ciclo:

if (Camb.radar) { 
    for (....) { 
     if (e instanceof EntityPlayer) { 
      EntityPlayer player = (EntityPlayer) e; 
      if (player.isDetected() || player == mc.thePlayer || mc.thePlayer.getDistanceToEntity(e) > 20.0) { 
       continue; 
      } 

      if (!player.isDetected()) { 
       mc.thePlayer.addChatMessage(....); 
       player.setDetected(true); // reset this flag when player goes out of radar 
      } 
     } 
    } 
}  
0

io suggerisco di fare come segue:

int radius = 0; 
if (Camb.radar) for (Entity e : (List <Entity>) mc.theWorld.loadedEntityList) 
    if (e instanceof EntityPlayer) { 
     EntityPlayer player = (EntityPlayer) e; 
     if (player == mc.thePlayer || mc.thePlayer.getDistanceToEntity(e) > 20.0) 
      continue; 
     while (radius < 1) { 
      mc.thePlayer.addChatMessage("\2479[CAMB] \247e" + player.getEntityName() + " has 
      entered your 20 block radius!"); 

     }  
    }