Воздействие на игроков в радиусе

183
1
5
День добрый.
Цель: Каждому игроку в радиусе X проигрывать определенную музыку.
Мое решение: При установке блока запускаем шедалер  который каждый тик для всех игроков в параллелепипеде проигрывает звук.
Проблема: Мое решение очень тормозное и вызывает жесточайшие подвисания вплоть до вылета игры. 
Мой код: PasteBin
 
Проигрывать музыку на серверной стороне. Гениально.
[merge_posts_bbcode]Добавлено: 22.10.2014 22:34:39[/merge_posts_bbcode]

А вообще лучше это делать через рандом дисплей тик.
 
Dragon2488 написал(а):
Проигрывать музыку на серверной стороне. Гениально.
[merge_posts_bbcode]Добавлено: 22.10.2014 22:34:39[/merge_posts_bbcode]

А вообще лучше это делать через рандом дисплей тик.

Сделал так
Код:
package red.windrose.blocks;

import java.util.Iterator;
import java.util.List;
import java.util.Random;

import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.potion.PotionEffect;
import net.minecraft.util.AxisAlignedBB;
import net.minecraft.world.World;

public class MusicBlockBase extends Block{
    public String music_file;
    public MusicBlockBase(Material material, String music) {
        super(material);
        this.setCreativeTab(CreativeTabs.tabDecorations);
        this.music_file = music;
    }
    
    public void onBlockAdded(World world, int x, int y, int z)
    {
        super.onBlockAdded(world, x, y, z);
        world.scheduleBlockUpdate(x, y, z, this, 1);
    }
    
    public void randomDisplayTick(World world, int x, int y, int z, Random rand) 
    {
        setPlayerAudio(world, x, y, z, rand, music_file);
    }
    @SideOnly(Side.CLIENT)
    private void setPlayerAudio(World world, int x, int y, int z, Random rand, String audio)
    {
        if (!world.isRemote)
        {
            AxisAlignedBB axisalignedbb = AxisAlignedBB.getAABBPool().getAABB((double)x, (double)y, (double)z, (double)(x + 1), (double)(y + 1), (double)(z + 1)).expand((double)100, (double)100, (double)100);
            axisalignedbb.maxY = (double)world.getHeight();
            List list = world.getEntitiesWithinAABB(EntityPlayer.class, axisalignedbb);
            Iterator iterator = list.iterator();
            System.out.println(list);
            EntityPlayer entityplayer;
            

            while (iterator.hasNext())
            {
                entityplayer = (EntityPlayer)iterator.next();
               System.out.println("I found player " + entityplayer.getDisplayName() + " in my radius");
            }

            while(!iterator.hasNext()){
                System.out.println("There are no players in my radius");
            }
        }
    }
}


Теперь не срабатывает вообще
 
-_-.
Ну ты проверку на сервер то убери (if(!world.isRemote) убери)
[merge_posts_bbcode]Добавлено: 22.10.2014 22:55:28[/merge_posts_bbcode]

А шеулд блок апдейт нафиг убери.
 
Dragon2488 написал(а):
-_-.
Ну ты проверку на сервер то убери (if(!world.isRemote) убери)
[merge_posts_bbcode]Добавлено: 22.10.2014 22:55:28[/merge_posts_bbcode]

А шеулд блок апдейт нафиг убери.
Конкретно протупил на этом моменте, но нет, теперь вылетает уже при установке блока

Agravaine написал(а):
Нет, попробую
 
.__________________________________________________________.
.__________________________________________________________.

.__________________________________________________________.

.__________________________________________________________.

.__________________________________________________________.

.__________________________________________________________.

.__________________________________________________________.

.__________________________________________________________.

.__________________________________________________________.

            while(!iterator.hasNext()){
                System.out.println("There are no players in my radius");
            }
 
iterator.next() возвращает следующий элемент из списка. iterator.hasNext() возвращает истину, если остались неперебранные (через iterator.next()) элементы.
Таким образом в первом цикле ты перебираешь все элементы из list, после чего в следующем цикле iterator.hasNext() всегда будет возвращать ложь и цикл станет бесконечным.
А вот почему вылетает именно из-за нехватки памяти, мне непонятно.

Надо писать как-то так:

Код:
List<EntityPlayer> list = world.getEntitiesWithinAABB(EntityPlayer.class, axisalignedbb);
for (EntityPlayer p : list)
    System.out.println("I found player " + p.getDisplayName() + " in my radius");
if (list.isEmpty())
    System.out.println("There are no players in my radius");
 
Asd73 написал(а):
iterator.next() возвращает следующий элемент из списка. iterator.hasNext() возвращает истину, если остались неперебранные (через iterator.next()) элементы.
Таким образом в первом цикле ты перебираешь все элементы из list, после чего в следующем цикле iterator.hasNext() всегда будет возвращать ложь и цикл станет бесконечным.
А вот почему вылетает именно из-за нехватки памяти, мне непонятно.

Надо писать как-то так:

Код:
List<EntityPlayer> list = world.getEntitiesWithinAABB(EntityPlayer.class, axisalignedbb);
for (EntityPlayer p : list)
    System.out.println("I found player " + p.getDisplayName() + " in my radius");
if (list.isEmpty())
    System.out.println("There are no players in my radius");
Спасибо тебе, это работает, однако память все равно потихоньку переполняется
 
Медаль за оформление вопроса :rolleyes:
 
Назад
Сверху