Перейти к содержанию
Авторизация  
donero

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

Рекомендуемые сообщения

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

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

Сборка Emurt

Изменено пользователем JoeyTribbiani

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Изменено пользователем zGosu
  • Upvote 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Вариант 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 код чтобы менять что-то внутри его функционала.

Изменено пользователем finfan

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
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-ух игроков, и один из них притянет уже старый кэш. Отсюда уже будут проблемы.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
2 часа назад, zGosu сказал:

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
1 час назад, Lovely сказал:

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
1 час назад, Mangol сказал:

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
3 часа назад, finfan сказал:

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

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

 

Цитата

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

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

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

Изменено пользователем Mangol

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация  

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...