- Баллы
- 76
Всем привет.
Я пишу плагин-аддон к одному интересному для меня плагину.
Так вот, если вкратце, то для игрока есть команда, при вводе которой открывается gui, где он может купить ту или иную "постройку" (это лишь название, на самом деле, всё виртуально и каждая купленная "постройка" записывается в бд) и получать с неё либо ресурсы, либо деньги, либо эффекты. Все это зависит от ветки развития (каждая "постройка" имеет свою ветку развития).
Это маленькая предыстория, а теперь перейдем к самой проблеме...
Каждая такая "постройка" прописана в конфиге в следующем виде:
У каждой такой "постройки" есть значение delay. Оно должно отвечать за то, раз во сколько секунд выдавать игроку ту или иную "награду" (зависит от вертки прокачки).
И проблема заключается в том, что я сильно затупил и вовсе не понимаю, каким образом можно считать время У КАЖДОЙ такой "постройки". То есть, например, у нас в конфиге есть 5 "построек" ветки MONEY, если игрок покупает сразу все 5 "построек", он должен получать деньги с каждой из них, но ведь у каждой их них есть свой delay и отталкиваясь от этого я хотел бы сделать так, чтобы время считалось у каждой купленной постройки и по его достижению того самого значения delay из конфига, происходило то самое действие (в зависимости от ветки пркоачки).
Возможно, стоит создать какой-то дополнительный класс? Честно, туплю и не могу понять, как это можно сделать.
Надеюсь, что я более-менее понятно все объяснил (если все же Вы чего-то не поняли, можете уточнить какой-либо момент, я всё постараюсь максимально подробно разъяснить). Надеюсь на Вашу помощь, не будьте злыми, помогите говнокодеру =(
Я пишу плагин-аддон к одному интересному для меня плагину.
Так вот, если вкратце, то для игрока есть команда, при вводе которой открывается gui, где он может купить ту или иную "постройку" (это лишь название, на самом деле, всё виртуально и каждая купленная "постройка" записывается в бд) и получать с неё либо ресурсы, либо деньги, либо эффекты. Все это зависит от ветки развития (каждая "постройка" имеет свою ветку развития).
Это маленькая предыстория, а теперь перейдем к самой проблеме...
Каждая такая "постройка" прописана в конфиге в следующем виде:
PHP:
builds:
money-1:
name: 'Банк-1'
branch: PVEmoney
cost: 25000
description:
- ''
- '&6❙ &7Цена: &e⛂%cost%'
- ''
- '&6❙ &7Улучшение:'
- '&fПри постройке Банк-1 Вы будете получать '
- '&f100 игровой валюты в банк города.'
type: MONEY
value: 100
delay: 30
showItem: BEACON,0,1
x: 0
y: 3
money-2:
name: 'Рынок'
required: money-1
branch: PVEmoney
cost: 50000
description:
- ''
- '&6❙ &7Цена: &e⛂%cost%'
- ''
- '&6❙ &7Улучшение:'
- '&fПри постройке Рынок Вы будете получать '
- '&f200 игровой валюты в банк города, каждый час.'
type: MONEY
value: 200
delay: 1400
showItem: CHEST,0,1
x: 1
y: 3
money-3:
name: 'Резиденция'
required: money-2
branch: PVEmoney
cost: 75000
description:
- ''
- '&6❙ &7Цена: &e⛂%cost%'
- ''
- '&6❙ &7Улучшение:'
- '&fПри постройке Резиденция Вы будете получать '
- '&f250 игровой валюты в банк города, каждый час.'
type: MONEY
value: 250
delay: 3600
showItem: BOOKSHELF,0,1
x: 2
y: 3
money-4:
name: 'Банк'
required: money-3
branch: PVEmoney
cost: 150000
description:
- ''
- '&6❙ &7Цена: &e⛂%cost%'
- ''
- '&6❙ &7Улучшение:'
- '&fПри постройке Банк Вы будете получать '
- '&f1000 игровой валюты в банк города, каждый час.'
type: MONEY
value: 1000
delay: 60
showItem: GOLD_BLOCK,0,1
x: 3
y: 3
И проблема заключается в том, что я сильно затупил и вовсе не понимаю, каким образом можно считать время У КАЖДОЙ такой "постройки". То есть, например, у нас в конфиге есть 5 "построек" ветки MONEY, если игрок покупает сразу все 5 "построек", он должен получать деньги с каждой из них, но ведь у каждой их них есть свой delay и отталкиваясь от этого я хотел бы сделать так, чтобы время считалось у каждой купленной постройки и по его достижению того самого значения delay из конфига, происходило то самое действие (в зависимости от ветки пркоачки).
Возможно, стоит создать какой-то дополнительный класс? Честно, туплю и не могу понять, как это можно сделать.
Надеюсь, что я более-менее понятно все объяснил (если все же Вы чего-то не поняли, можете уточнить какой-либо момент, я всё постараюсь максимально подробно разъяснить). Надеюсь на Вашу помощь, не будьте злыми, помогите говнокодеру =(
Здесь у меня есть цикл, который срабатывает каждую секунду и перебирает все деревни игроков (из другого плагина), чтобы уже выдавать игрокам "награду" за купленные "постройки"
PHP:
Bukkit.getScheduler().runTaskTimer(this, () -> {
for(Town town : TownyUniverse.getDataSource().getTowns()) {
TownBuild townBuild = new TownBuild(this, town);
townBuild.giveRewards();
}
}, 20L, 20L);
Этот метод нужен для выдачи "награды" игроку. Сюда бы, наверное, и нужно засунуть ту самую проверку, подошло ли время выдачи награды.
Мною написанный код ниже, скорее всего, является жутким говном, но тем не менее, попрошу Вас не упрекать меня в моём говнокодерстве, а дать какую-то конструктивную критику по улучшению этого кода
Мною написанный код ниже, скорее всего, является жутким говном, но тем не менее, попрошу Вас не упрекать меня в моём говнокодерстве, а дать какую-то конструктивную критику по улучшению этого кода
PHP:
public void giveRewards() {
if(getRewardType() != null) {
switch (getRewardType()) {
case MONEY: {
for (String rewardValue : configGetter.getValues(getRewardType(), this)) {
TownyEconomyHandler.add(town.getEconomyName(), Double.valueOf(rewardValue), Bukkit.getWorlds().get(0));
}
return;
}
case EFFECT: {
for(String rewardValue : configGetter.getValues(getRewardType(), this)) {
String[] effectParam = rewardValue.split(",");
PotionEffectType potionEffectType = PotionEffectType.getByName(effectParam[0]);
int potionLevel = Integer.parseInt(effectParam[1]);
for (Player player : TownyUniverse.getOnlinePlayers(town)) {
if (configGetter.getDisabledWorld().contains(player.getWorld().getName())) return;
if (player.hasPotionEffect(potionEffectType)) player.removePotionEffect(potionEffectType);
player.addPotionEffect(new PotionEffect(potionEffectType, 40, potionLevel));
}
}
return;
}
case RESOURCE: {
if(delay(Type.RESOURCE)) {
for (String rewardValue : configGetter.getValues(getRewardType(), this)) {
String[] itemsParam = rewardValue.split(",");
ItemStack itemStack = new ItemStack(Material.matchMaterial(itemsParam[0]), Integer.parseInt(itemsParam[2]), Short.parseShort(itemsParam[1]));
addItemsToDatabase(itemsParam);
getItems().add(itemStack);
}
}
return;
}
}
}
}