Jump to content
Sign in to follow this  
donero

после убийства всех противников ивент не заканчивается

Recommended Posts

Во время битвы на  ивентах LH/TvT  персонаж получает флаг,и после убийства всех противников ивент не заканчивается

как это исправить? 

Сборка Emurt

Edited by JoeyTribbiani

Share this post


Link to post
Share on other sites

проверку добавь, если все участники мертвы (player.isDead()), то завершать ивент.

Edited by zGosu
  • Upvote 1

Share this post


Link to post
Share on other sites

Это просто примеры, вам надо смотреть конкретно свою реализацию.

Вариант 1:

int counter = registeredPlayers.size();
for(Player next : registeredPlayers) {
	if(next.isDead()) 
		counter--;
}

if(counter <= 1) {
  //завершаем эвент
}

 

Вариант 2:

//изначально имеем слушатель или костыль типо слушателя, который записывает данные. Лучший вариант

void onPlayerDie(Player participiant) {
  // удаляем участника из листа если он отъехал
	registeredPlayers.remove(participiant);
	if(registeredPlayers.size() <= 1) {
     	//завершаем эвент 
    }
}

 

Вариант 3:

// у нас в эвенте есть прееменная
private int counter;

// которая считает убитых при их смерти
counter++;

//и ещё есть максимальное кол-во участников в текущем эвенте
private static final MAX_PLAYERS = 20;

// определяем после counter++ есть ли победитель?
boolean hasWinner = MAX_PLAYER - counter <= 1;
if(hasWinner) {
	//то завершаем эвент
}

 

Хороший Тон - Слушатель, т.к. нет особой вылазки в код. Не надо конкретно лазить в Event код чтобы менять что-то внутри его функционала.

Edited by finfan

Share this post


Link to post
Share on other sites
1 час назад, finfan сказал:

Это просто примеры, вам надо смотреть конкретно свою реализацию.

Вариант 1:


int counter = registeredPlayers.size();
for(Player next : registeredPlayers) {
	if(next.isDead()) 
		counter--;
}

if(counter <= 1) {
  //завершаем эвент
}

 

Вариант 2:


//изначально имеем слушатель или костыль типо слушателя, который записывает данные. Лучший вариант

void onPlayerDie(Player participiant) {
  // удаляем участника из листа если он отъехал
	registeredPlayers.remove(participiant);
	if(registeredPlayers.size() <= 1) {
     	//завершаем эвент 
    }
}

 

Вариант 3:


// у нас в эвенте есть прееменная
private int counter;

// которая считает убитых при их смерти
counter++;

//и ещё есть максимальное кол-во участников в текущем эвенте
private static final MAX_PLAYERS = 20;

// определяем после counter++ есть ли победитель?
boolean hasWinner = MAX_PLAYER - counter <= 1;
if(hasWinner) {
	//то завершаем эвент
}

 

Хороший Тон - Слушатель, т.к. нет особой вылазки в код. Не надо конкретно лазить в Event код чтобы менять что-то внутри его функционала.

В 3 варианте необходимо использовать методы которые обеспечивают thread safe. Может выйти так, что смерть сразу 2-ух игроков, и один из них притянет уже старый кэш. Отсюда уже будут проблемы.

Share this post


Link to post
Share on other sites
2 часа назад, zGosu сказал:

проверку добавь, если все участники мертвы (player.isDead()), то завершать ивент.

Немного не правильно, победители ивента не будут мертвы. 

Share this post


Link to post
Share on other sites
1 час назад, Lovely сказал:

Немного не правильно, победители ивента не будут мертвы. 

+ в эвентах напрмер лх можно делать тп в город, ты проиграл - иди фарми. Само собой также не будут мертвы

Share this post


Link to post
Share on other sites
1 час назад, Mangol сказал:

В 3 варианте необходимо использовать методы которые обеспечивают thread safe. Может выйти так, что смерть сразу 2-ух игроков, и один из них притянет уже старый кэш. Отсюда уже будут проблемы.

Можно тогда переменную counter сделать volatile и по плану всё будет нормально ;D либо синхронайз запулять там где нужно, хотя всё это - дерьмо, лучший вариант это листенер ;D

Share this post


Link to post
Share on other sites
3 часа назад, finfan сказал:

Можно тогда переменную counter сделать volatile и по плану всё будет нормально ;D либо синхронайз запулять там где нужно, хотя всё это - дерьмо, лучший вариант это листенер ;D

Использование CAS(ну если прям без CAS, можно использовать double checking в нужных местах), либо синхронизация блока, либо целого метода. Т.к. чистое поле volatile тут не спасет, может 2 раза завершить евент(заодно награды выдаст ^_^ 2 раза)

 

Цитата

// определяем после counter++ есть ли победитель?
boolean hasWinner = MAX_PLAYER - counter <= 1;
if(hasWinner) {
	//то завершаем эвент
}

Вот как раз тут.

P.S. В чем соль слушателя? Если он возможно как раз и будет дергать этот метод.(Ну конечно исключая тот факт если слушатель не вызывается синхронно через какой то контроллер).

Edited by Mangol

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...