[1.7.10]Вопрос про худ

tox1cozZ

aka Agravaine
8,453
599
2,906
Я рисую полоску хп моба, на которого смотришь.Но как только я не смотрю на моба, она сразу же пропадает.
Как мне можно сделать так, чтобы она еще секунд 5-7 не пропадала?

Код:
if(mc.objectMouseOver != null){
                if(mc.objectMouseOver.typeOfHit == MovingObjectType.ENTITY && mc.objectMouseOver.entityHit instanceof EntityLivingBase){

                    EntityLivingBase viewEntity = (EntityLivingBase)mc.objectMouseOver.entityHit;

                    int viewEntityHealthBarWidth = MathHelper.ceiling_float_int((viewEntity.getHealth() / viewEntity.getMaxHealth()) * 86);

                    /* Draw view entity health bar */
                    mc.ingameGUI.drawTexturedModalRect(66, 53, 0, 80, viewEntityHealthBarWidth, 6);

                    /* Draw view entity name */
                    mc.ingameGUI.drawCenteredString(mc.fontRenderer, viewEntity.getCommandSenderName(), 112, 64, Color.CYAN.getRGB());
                    
                    if(viewEntity instanceof EntityPlayer){
                        
                        int healthArmor = MathHelper.floor_float(viewEntity.getMaxHealth() + getArmorValue((EntityPlayer)viewEntity));
                        
                        /* Draw view player health + armor */
                        mc.ingameGUI.drawCenteredString(mc.fontRenderer, String.valueOf(healthArmor), 112, 55, Color.CYAN.getRGB());
                    }
                }
            }
 
При уходе курсора с объекта вызывать событие, ждать n*20 тиков и если время прошло и курсор не направлен на объект прекращать отображать?
 
Эмм..
Легко.
Заводишь отдельный таймер для каждого моба, если курсор наведен на моба, таймер сбрасывается:
Код:
if(mc.objectMouseOver.typeOfHit == MovingObjectType.ENTITY && mc.objectMouseOver.entityHit instanceof EntityLivingBase){
    EntityLivingBase viewEntity = (EntityLivingBase)mc.objectMouseOver.entityHit;
    viewEntity.setTimer(100);
    <...>
При этом ставишь перед отрисовкой хп бара (таким образом он за последнюю секунду плавно исчезнет)
Код:
      glColor4f(1, 1, 1, Math.max(20, viewEntity.getTimer())/20f);

Рисовать все хпбары придется через цикл, где перебираются все видимые игроком сущности мобов.
При этом при отрисовке каждого хпбара, очевидно, уменьшается таймер.
Отрисовка хпбара производится если таймер > 0.
Код:
viewEntity.setTimer(viewEntity.getTimer()-1);
Переменные мобам вроде можно добавлять через IExtendedEntityProperties?

---
Если не хочешь перебирать все сущности - есть вариант полегче.
При наведении курсора добавляешь сущность в созданную хешкарту (например сохранять ID сущности), туда же как значение суешь таймер. И тебе не придется возиться с переменными сущностей + не придется перебирать всех видимых сущностей. Это гораздо лучше.
Код:
private HashMap<Integer, Float> mobHpList = new HashMap<Integer, Float>();
<...>

Код:
if(mc.objectMouseOver.typeOfHit == MovingObjectType.ENTITY && mc.objectMouseOver.entityHit instanceof EntityLivingBase){
    EntityLivingBase viewEntity = (EntityLivingBase)mc.objectMouseOver.entityHit;
    mobHpList.put(viewEntity.entityID, 100);
    <...>
Код:
Iterator it = mobHpList.keySet().iterator(); //мы не хотим получить ConcurrentModificationException
while (it.hasNext()) {
    int i = it.next();
    if (mobHpList.get(i) < 0) {
        it.remove(); //убираем сущность из карты, если таймер истек
        continue;
    }
    mobHpList.put(i, mobHpList.get(i)-1); //уменьшаем таймер
    glColor4f(1, 1, 1, Math.max(0, Math.min(20, map.get(i)/20f)); //ограничиваем значение 0 снизу и 1 сверху
    EntityLivingBase entity = (EntityLivingBase)world.getEntityByID(i);
    <... draw the hpbar ...>
}
[merge_posts_bbcode]Добавлено: 07.10.2014 15:34:57[/merge_posts_bbcode]

Я ещё не очень уверен насчет участка кода, где я убираю ключ из кейсета, наверное, лучше убирать из хешкарты, но придется делать в два цикла. Сам смотри там, короче.
 
Поток.спать,конечно же я могу ошибаться,т.к, не кодил давно. Я щас чистой джавой пользуюсь
 
Ты захотел дедлока? Не надо юзать потоки для такой фигни. Это тебе не компютеркрафт.
 
Дедлок-то тут причем? Это вообще из другой оперы, дедлок когда ты обрабатываешь данные через synchronized блок c двух потоков и возникает ситуация, когда обе переменные читают друг друга, но они обе заблочены своими мониторами.

Слип просто повесит игру на нн-ое время и всё. Он тут никак не подойдет.
Плюс потоком ты ничего не добьешься, OpenGL дает рисовать только через свой поток.
И вообще, я уже описал способ и дал код, еппппппрст.
 
Oldestkon написал(а):
Дедлок-то тут причем? Это вообще из другой оперы, дедлок когда ты обрабатываешь данные через synchronized блок c двух потоков и возникает ситуация, когда обе переменные читают друг друга, но они обе заблочены своими мониторами.

Слип просто повесит игру на нн-ое время и всё. Он тут никак не подойдет.
Плюс потоком ты ничего не добьешься, OpenGL дает рисовать только через свой поток.
И вообще, я уже описал способ и дал код, еппппппрст.
Тебя просто игнорят походу:). Просто мы с Лешей Решили.... ай ладно, сам поймешь:)
 
Ты тут причем вообще?
Форум обезумел, совладаешь ли ты с ним?
 
Вы называете друг друга по именам всего лишь второй день, а мне это уже так противно..
 
Dragon2488 написал(а):
Вы называете друг друга по именам всего лишь второй день, а мне это уже так противно..
Ты бы знал, до чего мы в ВК додумались... кстати, это связано с тобой.
 
Можно и Pair, в ArrayList поместить его и все.
Так даже удалять легче.
 
Окей.
Представь ситуацию:
Стоят два моба рядом, на одном курсор, наводишь курсор на второго.
Пояснять дальше надо?
 
Назад
Сверху