Войти или зарегистрироваться

Мобы

morozzzlolka

Участник
Пользователь
Баллы
31
Всем привет! Пишу ещё раз.

В той теме мне помогли с дропом денег между всеми нападавшими.
Хотелось бы сделать босса, который делил бы мани за урон мобу.

Например: tester ударил моба 1 раз, нанёс ему мало дамага. После убийства ему дадут 4$. А tester2 ударил моба 100 раз и добил моба. Ему дадут 1996$. А максимальное количество денег, которое может дропнуться с моба - 2000$.
Как это реализовать? Пожалуйста, помогите :good:
 
Для босса нужно держать в памяти табличку (карту; объект, реализующий интерфейс Map; фактически это на практике HashMap) вида Map<UUID, Double damagers = new HashMap<>();. Если сервер версии 1.6 или более ранней, либо оффлайн режим, либо ещё какие-то причины, можно в качестве ключей использовать не UUID-ы игроков, а их имена. А можно и вообще объекты Player (только обрабатывай корректно их выход из игры).

Если одновременно на сервере может быть более одного босса, то нужно сделать такую карту на каждого босса. Например, Map<Entity, Map<UUID, Double>> bosses = new HashMap<>();. Да, карта карт.

Я что-то уже это, туплю, может быть damage не double, тогда просто поставить нужный тип дамага.
При ударе по мобу игроком:
Map<UUID, Double damagers = bosses.get(bossEntity);
UUID uuid = player.getUniqueId();
double damageSumm = damagers.get(uuid) + e.getDamage();
damagers.set(uuid, damageSumm);

Ну а при смерти моба взять посчитать сумму всех дамагов, ну и по пропорции всем раздать, карту почистить за собой.
 
Для босса нужно держать в памяти табличку (карту; объект, реализующий интерфейс Map; фактически это на практике HashMap) вида Map<UUID, Double damagers = new HashMap<>();. Если сервер версии 1.6 или более ранней, либо оффлайн режим, либо ещё какие-то причины, можно в качестве ключей использовать не UUID-ы игроков, а их имена. А можно и вообще объекты Player (только обрабатывай корректно их выход из игры).

Если одновременно на сервере может быть более одного босса, то нужно сделать такую карту на каждого босса. Например, Map<Entity, Map<UUID, Double>> bosses = new HashMap<>();. Да, карта карт.

Я что-то уже это, туплю, может быть damage не double, тогда просто поставить нужный тип дамага.
При ударе по мобу игроком:
Map<UUID, Double damagers = bosses.get(bossEntity);
UUID uuid = player.getUniqueId();
double damageSumm = damagers.get(uuid) + e.getDamage();
damagers.set(uuid, damageSumm);

Ну а при смерти моба взять посчитать сумму всех дамагов, ну и по пропорции всем раздать, карту почистить за собой.
Огромное спасибо!
Для босса нужно держать в памяти табличку (карту; объект, реализующий интерфейс Map; фактически это на практике HashMap) вида Map<UUID, Double damagers = new HashMap<>();. Если сервер версии 1.6 или более ранней, либо оффлайн режим, либо ещё какие-то причины, можно в качестве ключей использовать не UUID-ы игроков, а их имена. А можно и вообще объекты Player (только обрабатывай корректно их выход из игры).

Если одновременно на сервере может быть более одного босса, то нужно сделать такую карту на каждого босса. Например, Map<Entity, Map<UUID, Double>> bosses = new HashMap<>();. Да, карта карт.

Я что-то уже это, туплю, может быть damage не double, тогда просто поставить нужный тип дамага.
При ударе по мобу игроком:
Map<UUID, Double damagers = bosses.get(bossEntity);
UUID uuid = player.getUniqueId();
double damageSumm = damagers.get(uuid) + e.getDamage();
damagers.set(uuid, damageSumm);

Ну а при смерти моба взять посчитать сумму всех дамагов, ну и по пропорции всем раздать, карту почистить за собой.
Можно, пожалуйста подробнее, как это сделать? (кроме чистки карты)
 
Что именно подробнее? Пытайся сделать сам.
Даже так: пойди по простому пути и храни объекты Player в качестве ключей к тому, кто бил босса.
Храни всех боссов в Map<Entity, Map<Player, Double>> bosses.
При создании босса создай новую карту со списком тех, кто его будет бить: bosses.put(bossEntity, new HashMap<Player, Double>());
Когда его бьют (в эвенте дамага энтити) гляди, кто кого бьёт и как сильно, и по коду выше добавляй дамагу в карту.
Когда босс помер, посчитай общий дамаг, зная общее число монет(?) подели их на всех пропорционально. Если player.isOnline() == false, не отдавай ему денег, ну типа вышел -- сам виноват.
Там же не забудь удалить карту для мёртвого моба: bosses.remove(bossEntity).

Всё.
 
Что именно подробнее? Пытайся сделать сам.
Даже так: пойди по простому пути и храни объекты Player в качестве ключей к тому, кто бил босса.
Храни всех боссов в Map<Entity, Map<Player, Double>> bosses.
При создании босса создай новую карту со списком тех, кто его будет бить: bosses.put(bossEntity, new HashMap<Player, Double>());
Когда его бьют (в эвенте дамага энтити) гляди, кто кого бьёт и как сильно, и по коду выше добавляй дамагу в карту.
Когда босс помер, посчитай общий дамаг, зная общее число монет(?) подели их на всех пропорционально. Если player.isOnline() == false, не отдавай ему денег, ну типа вышел -- сам виноват.
Там же не забудь удалить карту для мёртвого моба: bosses.remove(bossEntity).

Всё.
спасибо!
 
Что именно подробнее? Пытайся сделать сам.
Даже так: пойди по простому пути и храни объекты Player в качестве ключей к тому, кто бил босса.
Храни всех боссов в Map<Entity, Map<Player, Double>> bosses.
При создании босса создай новую карту со списком тех, кто его будет бить: bosses.put(bossEntity, new HashMap<Player, Double>());
Когда его бьют (в эвенте дамага энтити) гляди, кто кого бьёт и как сильно, и по коду выше добавляй дамагу в карту.
Когда босс помер, посчитай общий дамаг, зная общее число монет(?) подели их на всех пропорционально. Если player.isOnline() == false, не отдавай ему денег, ну типа вышел -- сам виноват.
Там же не забудь удалить карту для мёртвого моба: bosses.remove(bossEntity).

Всё.
А вы перфекционист. Порой ваши сообщения удивляют =)
 
Назад
Верх