Обновлено: 10.02.2023
POT_ZOMBIE:
— SPEED, 60, 3, 100
SPEED — сам эффект, 60 — время действия эффекта, 3 — уровень эффекта, 100 — шанс спавна зомби с этим эффектом.
Настройка спавна мобов с броней:
ARM_ZOMBIE:
— IRON_HELMET, 50, 100
IRON_HELMET — железный шлем, 50 — шанс спавна зомби с этим шлемом, 100 — шанс дропа этого шлема.
Можно настроить названия мобов:
NAME_ZOMBIE:
— «Vladimir»
Vladimir — это имя нашего зомби. Если вы не хотите переименовывать зомби, то удалите эту строку в конфиге (NAME_ZOMBIE: — «Vladimir»).
Параметры команды
Используя таблицу, можно подобрать необходимые параметры и изменить их при необходимости.
Впервые команда /gamerule была добавлена в версии 1.4.2. Команда /gamerule имеет большое количество параметров, которые обновляются с новыми версиями.
Свой дроп с блоков
@DStriker, Это сейчас всего пара строчек, а потом будет сто, двести и так далее, а я хочу начать оптимизацию с самых первых строчек, чтобы потом не приходилось переписывать уже сотню или две, в целях оптимайза. Эта строчка кода, то есть сравнение каждому сломанному блоку, является ли он рудой, происходит соответственно, при каждом сломанном блоке, а если данная модификация будет стоять на клиенте с модами, в которых есть какие нибудь карьеры или что то типа того? Может с клиентом ничего особого не случится в данном случае, но если эту сборку уже завезти на сервер, с допустим 10 игроками, и у каждого по карьеру, а половина вообще забустит свои карьеры на скорость, то в такой ситуации я считаю, что оно того стоит.
Будьте так добры, расскажите за ASM и хуки и переделывание ванильных классов, желательно подробнее, если вас это не затруднит, ну или скиньте ссылки, желательно на русскоязычную документацию. Заранее благодарю.
Почему я так помешан на оптимизации? Потому что я хочу именно развиваться в этом плане, наращивать знания, и писать хороший код, а в следствии и сами моды, чтобы люди не матерились на меня, используя мои модификации. И в следствии использовать свои знания для исправленияоптимизации других модификации.
Как получить?
С помощью стола зачарований в обмен на опыт и лазурит.
Используя наковальню и необходимую книгу зачарований. Ее можно найти, исследуя данжи.
Получив книгу с таким эффектом с помощью рыбалки или при исследовании данжей.
Купить предмет с эффектом у деревенского жителя.
Команда /gamerule
Команда /gamerule поможет игроку устанавливать определенные правила для игрового мира Майнкрафт. С ее помощью можно будет установить или же изменить некоторые аспекты выживания и сделать выживание более удобным или сложным.
Интересные факты
1 . Зачарование Добыча позволит увеличить количество дропа во время убийства различных мобов.
2 . Повышает шанс на получение ценных предметов.
3 . Подойдет для меча и топора.
Зачарование Добыча
Уровни
- 1 уровень. Увеличение лута на 1 предмет, а также увеличение шанса получения ценных предметов на 0.5 процентов.
- 2 уровень. Увеличение лута на 2 предмета, а также увеличение шанса получения ценных предметов на 1 процент.
- 3 уровень. Увеличение лута на 3 предмета, а также увеличение шанса получения ценных предметов на 1.5 процента.
Эти чары крайне эффективны во время создания ферм опыта на основе зомби, скелетов, пауков и прочих враждебных мобов. Так можно получать различные зачарованные книги, железо, морковь, картофель и другие ценные ресурсы, нужные для выживания.
Зачарование Добыча | |
---|---|
ID | Looting |
Шанс (в процентах)* | 3 |
Предметы | |
Максимальный уровень** | 3 |
* Указывается шанс получения эффекта в столе зачарований.
** Каждое зачарование обладает определенным максимальным уровнем, который можно получить при помощи стола чар.
Правила использования
Команда достаточно простая, для ее использования необходимо знать следующие правила:
/gamerule <Необходимый параметр> ввести [true] или [false]
Читайте также:
- Как сделать приют для животных в симс фриплей
- Кто такой гс в самп
- Как обновить прошивку монитора samsung odyssey g5
- Кому пить из источника dragon age inquisition
- Почему у ребенка желтые коленки
-
#1
Интересует, как добавить уже существующим монстрам дроп своих или чужих предметов с определенным шансом, есть что-то не костыльное для этого?
-
#2
Вы вообще умеете смотреть файлы форджа?
LivingDropsEvent.
-
#3
Мой инет упоролся. Я вроде бы уже написал что LivingDropsEvent
-
#4
Я предполагал, что это так же просто, как и зарегистрировать предмет/блок/ивент.Но тут опять же ивентом только, печально.
-
#5
Что за херню ты сказал? С хрена ли печально?
-
#6
Эм, с каких пор юзать ивенты — это плохо?
Они для этого и созданы, лол.
-
#7
Я написал, а не сказал, а печально, потому что пойду разбирать всё это потом.
-
#8
Это невероятно просто, ты зря печалишься…
-
#9
public class CustomLivingDrops {
public static double rand;
@ForgeSubscribe
public void dropPig(LivingDropsEvent event) {
if (event.source.getDamageType().equals("player")) {
rand = Math.random();
if (event.entityLiving instanceof EntityPig) {
if (rand < 0.25D) {
event.entityLiving.dropItem(Item.leather.itemID, 1);
}
}
}
}
}
-
#10
Я сделал иначе
public static double rand;
public Random r = new Random();
@ForgeSubscribe
public void DropHandler(LivingDropsEvent event) {
if(event.entityLiving instanceof EntityPigZombie) {
event.entityLiving.entityDropItem(new ItemStack(vazkii.tinkerer.common.item.ModItems.kamiResource.itemID, 1, 6), r.nextInt(40));
}
}
[merge_posts_bbcode]Добавлено: 18.08.2014 18:33:10[/merge_posts_bbcode]
Volkula написал(а):
public class CustomLivingDrops { public static double rand; @ForgeSubscribe public void dropPig(LivingDropsEvent event) { if (event.source.getDamageType().equals("player")) { rand = Math.random(); if (event.entityLiving instanceof EntityPig) { if (rand < 0.25D) { event.entityLiving.dropItem(Item.leather.itemID, 1); } } } } }
Спасибо, не учёл, что нужно сделать проверку исходит ли урон от игрока или от внешнего объекта.
-
#11
И в итоге получил херню из за того что рандом на сервере и клиенте разный. делай рандом с сидом.
-
#12
Dragon2488 написал(а):
И в итоге получил херню из за того что рандом на сервере и клиенте разный. делай рандом с сидом.
То есть представленные выше варианты не являются корректными, и нужно делать рандом
вот так:
Или я опять в своей нубизме перешёл все границы?
-
#13
Ты перешел свои границы. world.getRNG
-
#14
Dragon2488 написал(а):
Ты перешел свои границы. world.getRNG
По моему на 1.6.4 такого нету
-
#15
Random rand = new Random(13124);
Вот так устанавливается сид.
А обычно делают свои генераторы рандома.
-
#16
Dragon2488 написал(а):
И в итоге получил херню из за того что рандом на сервере и клиенте разный.
А почему бы не просто world.isRemote?
У меня все прекрасно работает:
for(int i1 = 0; i1 < mobData.getItemsData().size(); i1++) {
MobItem item = mobData.getItemsData().get(i1);
double random = Math.random();
double randomFor = (double) item.getDropChance() / 100;
if(random < randomFor) {
int count = MathHelper.getRandomIntegerInRange(new Random(), item.getCountFrom(), item.getCountTo());
eventEntity.entityDropItem(new ItemStack(item.getID(), count, item.getMetaData()), 1.0F);
}
}
this.disableXpDrop((EntityLivingBase) eventEntity);
double random = Math.random();
double randomFor = (double) mobData.getXpDropChance() / 100;
if(random < randomFor) {
int count = MathHelper.getRandomIntegerInRange(new Random(), mobData.getXpDropFrom(), mobData.getXpDropTo());
while (count > 0)
{
int j = EntityXPOrb.getXPSplit(i);
count -= j;
eventEntity.worldObj.spawnEntityInWorld(new EntityXPOrb(eventEntity.worldObj, eventEntity.posX, eventEntity.posY, eventEntity.posZ, count));
}
}
-
#17
Я обычно юзаю рандом мира, а не генерирую свой с сидом.
[merge_posts_bbcode]Добавлено: 19.08.2014 18:45:55[/merge_posts_bbcode]
Я обычно юзаю рандом мира, а не генерирую свой с сидом.
Рассказывает Kyatric
В экшн-играх обычной механикой является выпадение из убитого врага какой-то вещи или награды. Игрок может собрать эту добычу и получить какое-то преимущество. В этом руководстве мы поговорим об устройстве и реализации этой системы.
Демки созданы в Construct 2, HTML5-инструменте для разработки игр, но вы можете реализовать эту механику, используя любой язык или инструмент. Я использовал версию r167.2. Вы можете скачать свежую версию здесь и разобраться с примерами. Их исходники можно найти здесь.
Базовая механика
После смерти врага (когда его HP меньше или равны нулю) вызывается функция. Задачей функции является определение наличия и типа лута.
Функция также может управлять визуальным отображением лута, показывая его на месте, где был убит враг.
Вот пример:
Нажмите кнопку Slay 100 Beasts. Это запустит процесс, который создаст 100 случайных существ, убьёт их и выведет результат для каждого их них (выпал ли лут, и если выпал, то какой). Статистика внизу экрана показывает количество существ, с которых выпал лут, и количество предметов каждого типа).
Этот пример показывает логику функции и демонстрирует тот факт, что эту систему можно применить для игры любого жанра.
Давайте разберемся, как работает демка. Во-первых, существа и предметы содержатся в массивах. Вот массив beast
:
А вот массив drops
:
Величина X
— это уникальный идентификатор существа или предмета. Например, существо номер 0 — это Кабан. Предмет номер 3 — это Бриллиант.
Эти массивы мы используем как справочник. В массиве существ есть ещё два столбца:
- Вероятность падения определяет шанс дропа лута после смерти существа. Например, с Кабана точно что-то выпадет, а вот с Совы — только с вероятностью 15%.
- Редкость предмета определяет степень ценности выпадаемого предмета (чем больше значение, тем менее ценным является предмет — так уж я написал функцию).
Это удобно с точки зрения баланса: мы не хотим дать игроку много топовых предметов в начале игры, ведь так он потеряет интерес.
Эти таблицы — лишь пример, и вы можете и должны настроить их самостоятельно, подогнав под свою систему. Если вы хотите узнать больше о балансе в играх, ознакомьтесь с этой серией статей (прим перев.: мы уже переводили одну статью, посвящённую балансу в играх, можете прочитать и её).
Давайте взглянем на псевдокод демки:
CONSTANT BEAST_NAME = 0
CONSTANT BEAST_DROPRATE = 1
CONSTANT BEAST_RARITY = 2
CONSTANT DROP_NAME = 0
CONSTANT DROP_RATE = 1
//Those constants are used for a better readability of the arrays
On start of the project, fill the arrays with the correct values
//The array that contains the values for each beast:
array aBeast(6,3)
//The array that contains the values for each item:
array aDrop(6,2)
//A temporary array that will allow us what item type to drop:
array aTemp(0)
//The array that will contain the amount of each item dropped:
array aStats(6)
On button clicked
Call function "SlainBeast(100)"
Function SlainBest (Repetitions)
//The variable that will keep the count of
//how many beasts did drop item:
int BeastDrops = 0
Text.text = ""
//Resets all the values contained in this array
//to make new statistics for the current batch:
aStats().clear
Repeat Repetitions times
int BeastType
int DropChance
int Rarity
//Since we have 6 beasts in our array:
BeastType = Random(6)
//Get the rarity of items the beast should drop
//from the aBeast array:
Rarity = aBeast(BeastType, BEAST_RARITY)
//Picks a number between 0 and 100):
DropChance = ceil(random(100))
Text.text = Text.text & loopindex & " _ " &
aBeast(BeastType,BEAST_NAME) & "is slain"
If DropChance > aBeast(BeastType,BEAST_DROPRATE)
//The DropChance is bigger than the droprate for this beast
Text.text = Text.text & "." & newline
//We stop here, this beast is considered
//to not have dropped an item.
If DropChance <= aBeast(BeastType,BEAST_DROPRATE)
//We will put some text to display what item was dropped
Text.text = Text.Text & " dropping "
//On the other hand, DropChance is less or equal the droprate
//for this beast
//We clear/clean the aTemp array in which we will push
//entries to determine what item type to drop
aTemp(0)
//We will loop through every elements of the aDrop array
For a = 0 to aDrop.Width
//When the item drop rate is greater or equal the expected Rarity
aDrop(a,DROP_RATE) >= Rarity
//We put the current a index in the temp array.
//We know that this index is a possible item type to drop
Push aTemp,a
int DropType
//The DropType is one of the indexes contained
//in the temporary array
DropType = random(aTemp.width)
Text.text = Text.text & aDrop(DropType, DROP_NAME)
& "." & newline //We display the item name that was dropped
//We do some statistics
aStats(DropType) = aStats(DropType) + 1
BeastDrops = BeastDrops + 1
TextStats.Text = BeastDrops &
" beasts dropped items."& newline
//Display each item amount that was dropped
For a = 0 to aStats.width
and aStats(a) > 0
TextStats.Text = TextStats.Text &
aStats(a) & " " & aDrop(a,DROP_NAME) & " "
Начнём с пользовательского действия: нажатия на кнопку. Кнопка вызывает функцию с параметром 100. В реальности вы скорее всего будете убивать врагов по одному 🙂
После этого вызывается функция SlainBeast
. Её задачей является вывод сообщения для игрока. Она очищает переменную BeastDrops
и массив aStats
, которые используются для статистики. В реальной игре они вам не понадобятся. Функция также очищает Text
, чтобы для вывода результата использовались 100 новых строк. В самой функции создаются три переменные: BeastType
, DropChance
и Rarity
.
BeastType
будет номером, по которому мы будем обращаться к строке в массиве aBeast
; по сути, это тип существа. Rarity
также берется из массива aBeast
; это редкость выпавшего предмета, и значение мы будем брать из поля «Редкость предмета» массива aBeast
.
И наконец, DropChance
— это случайное число от 0 до 100. В большей части языков программирования есть функция, возвращающая случайное число от 0 до 1, мы просто умножим его на 100.
Теперь мы можем выводить информацию в объект Text
: нам уже известен тип существа. Поэтому мы конкатенируем значение Text.text
и BEAST_NAME
текущего BeastType
из массива aBeast
.
Затем нам нужно определить, выпал ли предмет. Для этого мы сравним DropChance
с величиной BEAST_DROPRATE
из массива aBeast
. Если DropChance
меньше или равен этой величине, предмет выпал.
Итак, процесс выпадения предмета задаётся двумя строками. Первая:
DropChance > aBeast(BeastType,BEAST_DROPRATE)
В этом случае DropChance
больше DropRate
, и это значит, что предмет не выпал. После этого мы выводим только завершающую предложение «[BeastType] was slain.» точку и переходим к следующему существу..
Вторая:
DropChance <= aBeast(BeastType,BEAST_DROPRATE)
В этом случае DropChance
меньше или равен DropRate
текущего BeastType
, поэтому мы считаем, что предмет должен выпасть. Для этого мы сравниваем редкость предмета, которая задана текущему существу, и несколько значений редкости, заданных в таблице aDrop
.
Мы просматриваем всю таблицу aDrop
, занося каждый подходящий номер в массив aTemp
. В результате там должен быть как минимум один номер. После этого мы создаём переменную DropType
, которая случайным образом выбирает один из номеров в массиве aTemp
; это и есть выпавший предмет.
Мы добавляем имя предмета в предложение, которое становится таким: «BeastType
was slain, dropping a DROP_NAME
.». Затем мы изменяем статистику (в массиве aStats
и в BeastDrops
).
Наконец, после 100 повторов, мы выводим статистику, количество существ, с которых выпал лут, и количество предметов каждого типа.
Ещё один пример: отображаем предметы
Давайте разберем ещё один пример:
Нажмите Пробел для запуска фаербола, который убьёт врага.
Как видно, создаётся случайный враг. Игрок может совершить дистанционную атаку. Когда снаряд попадает во врага, тот умирает.
Здесь используется аналогичная прошлой функция, но в этот раз она вдобавок создаёт визуальное отображение выпавшего предмета и изменяет статистику в нижней части экрана.
Вот псевдокод:
CONSTANT ENEMY_NAME = 0
CONSTANT ENEMY_DROPRATE = 1
CONSTANT ENEMY_RARITY = 2
CONSTANT ENEMY_ANIM = 3
CONSTANT DROP_NAME = 0
CONSTANT DROP_RATE = 1
//Constants for the readability of the arrays
int EnemiesSpawned = 0
int EnemiesDrops = 0
array aEnemy(11,4)
array aDrop(17,2)
array aStats(17)
array aTemp(0)
On start of the project, we roll
the data in aEnemy and aDrop
Start Timer "Spawn" for 0.2 second
Function "SpawnEnemy"
int EnemyType = 0
//We roll an enemy type out of the 11 available
EnemyType = random(11)
//We create the visual object Enemy on screen
Create object Enemy
Enemy.Animation = aEnemy(EnemyType, ENEMY_ANIM)
EnemiesSpawned = EnemiesSpawned + 1
txtEnemy.text = aEnemy(EnemyType, ENEMY_NAME) &
" appeared"
Enemy.Name = aEnemy(EnemyType, ENEMY_NAME)
Enemy.Type = EnemyType
Keyboard Key "Space" pressed
Create object Projectile from Char.Position
Projectile collides with Enemy
Destroy Projectile
Enemy start Fade
txtEnemy.text = Enemy.Name & " has been vanquished."
Enemy Fade finished
//Once the fade out is finished, we wait 2.5 seconds before
//spawning a new enemy at a random position on the screen
Start Timer "Spawn" for 2.5 seconds
Function "Drop" (Enemy.Type, Enemy.X, Enemy.Y, Enemy.Name)
Function Drop (EnemyType, EnemyX, EnemyY, EnemyName)
int DropChance = 0
int Rarity = 0
DropChance = ceil(random(100))
Rarity = aEnemy(EnemyType, ENEMY_RARITY)
txtEnemy.text = EnemyName & " dropped "
If DropChance > aEnemy(EnemyType, ENEMY_DROPRATE)
txtEnemy.text = txtEnemy.text & " nothing."
//Nothing was dropped
If DropChance <= aEnemy(EnemyType, ENEMY_DROPRATE)
aTemp.clear/set size to 0
For a = 0 to aDrop.Width
and aDrop(a, DROP_RATE) >= Rarity
////We push the current index into the aTemp array
//as possible drop index
aTemp.Push(a)
int DropType = 0
//We pick what is the drop index amongst
//the indexes stored in aTemp
DropType = Random(aTemp.Width)
aStats(DropType) = aStats(DropType) + 1
EnemiesDrops = EnemiesDrops + 1
Create Object Drop at EnemyX, EnemyY
Drop.AnimationFrame = DropType
//We display the name of the drop
txtEnemy.Text = txtEnemy.Text &
aDrop.(DropType, DROP_NAME) & "."
txtStats.text = EnemiesDrops & " enemies on " &
EnemiesSpawned & " dropped items." & newline
For a = 0 to aStats.width
and aStats(a) > 0
txtStats.text = txtStats.Text & aStats(a) &
" " & aDrop(a, DROP_NAME) & " "
Timer "Spawn"
Call Function "SpawnEnemy"
Давайте взглянем на таблицы aEnemy
и aDrop
:
В отличие от прошлого примера, массив, содержащие данные о врагах, называется aEnemy
и содержит ещё один столбец данных, в котором хранятся названия анимаций. Таким образом, при появлении врага автоматически создаётся его анимация.
aDrop
теперь содержит 16 элементов, и каждый номер относится с анимации объекта — но я также мог создать отдельную анимацию для каждого предмета.
В этот раз врагов у нас гораздо больше. Тем не менее, единственным изменением является то, что мы разделили появление врагов и функцию, определяющую наличие выпавшего лута. Вы сделали это, потому что в реальной игре враги не будут просто ждать, пока их убьют.
Теперь у нас есть функция SpawnEnemy
и функция Drop
. Drop
очень похожа на вариант из прошлого примера, но теперь принимает несколько параметров: координаты врага на экране (там будет отображён предмет), тип врага и его название из таблицы aEnemy
.
Логика функции Drop
не изменилась; мы добавили лишь способ отображения информации.
Замечание: для размещения врагов в разных местах экрана я использовал невидимый объект
Spawn
, постоянно двигающийся влево-вправо. При вызове функцииSpawnEnemy
она создаёт врага в текущих координатах объектаSpawn
.
Осталось только решить, когда вызывать Drop
. Я запускаю её не сразу после смерти врага, а после исчезновения его модели. Вы же можете настроить это на свой вкус.
Заключение
На уровне гейм-дизайна, наличие системы лута даёт игроку стимул сражаться с врагами для получения усилений, снаряжения и выполнения задач, прямым или косвенным образом.
На уровне реализации, выпадение предметов задано функцией, проверяющей уровень редкости предмета в зависимости от убитого врага и отображающей нужную информацию на экране. Необходимые данные хранятся в структурах данных наподобие массивов, которые доступны функции.
Перевод статьи «How to Code Monster Loot Drops»
Реализация выпадания вещей |
||||||
|
||||||
|
||||||
|
||||||
|
||||||
|
||||||
|
||||||
|
||||||
|
|
|
ЛОТЕРЕИ: ВЕРОЯТНОСТЬ НА РАЗДАТЧИКАХ
Приветствую всех!
Сегодня речь пойдёт о любителях ядерных реакторов лотереях на раздатчиках.
Данное явление приобрело повсеместный характер на индустриальных серверах, хотя такие можно создавать и на редстоуне.
Другими словами, такую лотерею можно сделать на любом сервере (кроме серверов STALKER, конечно же).
Гайд предназначен для людей, которые не имели раньше дела с раздатчиками и не знают, не понимают, или просто хотят подтянуть теорию вероятностей, применительно к данной игре, либо вообще не имели дело с математикой.
Показать содержимое
Немного по терминам, которые будут использованы далее.
1) Обозначим под словом «слот» место, куда Вы можете положить предметы. В раздатчике их 9.
2) Обозначим под словом «событие» любой выпавший предмет при подаче сигнала на раздатчик, что, в свою очередь, назовём испытанием.
3) Обозначим под «правильным предметом» тот предмет, при выпадении которого сработает механизм лотереи.
3) Обозначим под словосочетанием «успешный исход» событие, при котором из раздатчика выпадает тот предмет, что мы задали как «правильный«. В нашем случае это железный слиток.
3) Обозначим под буквой «N» общее количество слотов, занятых предметами, буквой «K» — количество раздатчиков. На картинке — слева N = 2, справа N = 9.
4) Обозначим под «P1, P2, P3,…, PK» вероятность выпадения правильного предмета (успешного исхода) одновременно из одного, двух, трех, …, K раздатчиков. Просто буквой P мы обозначим вероятность того, что раздатчик даст нам успешный исход.
Также обозначим под «Q» выпадение любого другого предмета, который нас не интересует, при любом количестве раздатчиков. В нашем случае это жёлтая коробка утильсырья, которая известна игрокам на инде.
А теперь по сути.
Раздатчик работает следующим образом: при подаче редстоун-сигнала на него, он выбирает случайный слот и выбрасывает из него предмет.
Вероятности успешных исходов в одном раздатчике при разном количестве предметов я приведу под спойлером.
Показать содержимое
—
Вероятности при разном N будут вычисляться как «Кол-во нужных предметов, деленных на N»
Количество занятых слотов N=1, вероятность (P) равна 1, то есть 100% выпадет нужный предмет
N=2 => P=0.5, то есть либо один, либо другой, с вероятностью 50/50.
N=3 => P будет равна 1 из 3, или 1/3, или 0.3333
N=4 => P=0.25
N=5 => P=0.2
N=6 => P=0.167
N=7 => P=0.143
N=8 => P=0.125
N=9 => P=0.111
При двух правильных предметах вероятность увеличивается вдвое и так далее.
Итак у нас есть некоторое количество раздатчиков — K штук, при одновременном нужном исходе на каждом из них игрок получает выигрыш — джекпот. Вероятность джекпота при этом равна общей вероятности нужных исходов.
Общий вид задачи, которая перед нами стоит:
Minecraft:
Есть K раздатчиков, в каждом одна и та же пропорция правильных предметов, соответственно вероятность нужного исхода одна и та же — P. Нужно узнать, с какой вероятностью из каждого раздатчика выпадет правильный предмет.
Это же можно представить на языке математики.
Математика, тервер:
Вероятность нужного события в одном испытании равна P, и мы производим K испытаний. Найти вероятность того, что будет K успешных событий.
Формула решения будет выглядеть не так страшно:
Что означает: Вероятность K успешных равновероятностных событий в K испытаний равна вероятности успешного события в степени K.
Или: Джекпот мы получим в лотерее из K раздатчиков с девятью слотами и лишь одним ПРАВИЛЬНЫМ предметом внутри (как обычно делают), с вероятностью .
Вот допустим лотерея, где либо гравитационный жилет, либо безделушка.
Лотерея на раздатчиках, билет приобретается слева снизу, каждый раздатчик с 9 слотами, из них 1 — «правильный».
А теперь собственно вероятности победы в такой лотерее:
На двух таких раздатчиках — , это 1,24%
На трёх таких раздатчиках = , это 0.137%
На четырёх — , это 0.015%!!
На пяти — , это уже меньше двух ТЫСЯЧНЫХ процента.
Дальше уже не имеет смысла рассматривать такие лотереи.
А теперь поясним за цены на билеты в таких лотереях.
Объективная цена билета должна равняться цене приза, помноженной на вероятность выпадения.
Примем стоимость джекпота за 100 000 (сто тысяч) монет. Напомню, что вероятность для каждого равна 1/9.
Цена билета лотереи на одном таком раздатчике будет равняться монет
На двух таких раздатчиках = монеты
На трёх — монет.
На четырёх — монет.
Дальше уже, опять же, не имеет смысла рассматривать такие лотереи.
Чтобы посчитать цену билета на такой лотерее для цены джекпота нужно во столько же раз поделить цену билета выше, во сколько сто тысяч больше этой цены. Для лотереи на четырёх ТАКИХ раздатчиках с ценой джекпота в 50 000 монет цена билета должна быть 7 монет. И так далее.
После прочтения этой краткой лекции по математике у вас могли возникнуть следующие вопросы.
Показать содержимое
1) Зачем нам это всё знать?
В школке понадобится. В университете — тоже. В майнкрафте, судя по последним событиям, тоже.
2) Я не хочу думать. Я хочу строить ядерки и создавать лаги на сервере.
Панятна.
3) Ты разрушил мою империю!!1! ЗАЧЕМММММ
По приказу острых Т/ЯД. магнитов. Модераторов заколебали вопросы о проверке лотереек. Проверяйте сами.
4) Ты поставил знак «=» вместо «≈»
Лесом.
5) Почему так а не иначе?
Вот поэтому.
5) Ты неправильно посчитал, извинись.
Пожалуйста, пересчитай и напиши в этой теме.
6) Ошибся общепринятым термином, извинись.
Индифферентно, в полной мере. Суть я передал.
Надеюсь, хотя бы кто-то прочитает всё, преисполнится в математике майнкрафта и не пошлёт меня в овраг.
Напомню, что использование реакции деления для получения энергии дарует Вам вечные муки во Втором Великом Синтезе.
ПО ПРИКАЗУ ОСТРЫХ Т/ЯД. МАГНИТОВ!
За время, прошедшее с выпуска игры я видел множество критики, связанной с балансом. Одни не нравится отсутствие динамики, других бесит респаун монстров. Кто то хочет побыстрее прокачаться, иные собрать полные сеты.
В этом может помочь изменения файлика balance.txt находящегося по адресу Диск:Корневая папка игрыscriptsserver.
Вот список известных на сегодняшний день настроек баланса, которыми можно немного подстроить под себя игру:
Внимание! Все изменения производятся на ваш страх и риск. И настоятельно советуется сделать бекап изменяемого файла, так как изменения некоторых значений могут повлечь серьезные последствия, вплоть до невозможности начать игру.
Если нужны деньги или уникальные вещи:
PriceAdjustment
PriceLeveldiscount
PriceShredder
PriceSlotfactor — Стоимость вещей у торговца. Если испытываете недостаток в деньгах выставьте значения на 1000 и купите, а потом продайте что-нибудь у торговца. Обязательно именно купить и продать, иначе не заработает.
IsUsableByHero — если значение равно предыдущему, то вещи выпадают только для вашего персонажа. (может повлиять на исчезание из игры определённого класса предметов… так что если вы у торговца не увидите вообще доспехов, оружия, колец и дропаца они так же не будут, то это из-за вышеуказанной величины… by zamalaya)
NORMAL_STANDARD
CHAMP_STANDARD
BOSS_STANDARD
EXTRAGOLD
EXTRAPOTION — Параметры дропа вещей, зелий и золота.
TraderOfferUpperRareBase при значении 1000 у продавца в ассортименте практически все вещи уникальные.
Существует множество способов увеличить шанс выпадения рун:
IsRuneForHero — поставьте на 10000, если хотите, что бы все руны были только для вашего персонажа.
RuneAmountTotal если вы хотите очень много рун, то просто прибавьте к этому значению пару тройку нулей. В сочетании с предыдущими настройками, руны падают очень часто.
Еще один способ увеличить дроп рун, изменить следующие три значения:
NORMAL_RUNE
CHAMP_RUNE
BOSS_RUNE
EXTRARUNE
Чем больше значения тем больше рун. Можно добиться такого, что на 10 лвл все заклинания будут прокачаны по максимуму (если конечно есть максимум)
SwapRune_One = 125000,
SwapRune_Two = 25000,
SwapRune_Three = 5000,
SwapRune_Four = 500 — (изменено и проверено) отвечает за стоимость обмена рун у рунного мастера.
Опыт:
QuestExplow
QuestExpmax — Даваемый опыт за квесты. Выставьте на 1000000 что бы прокачаться до 200 за несколько квестов.
MP_experience Даваемый опыт за убийство монстров. Можно если несильно подредактировать, то можно чуть ускорить получения опыта, без потерь для интересности игры.
Сложность игры:
Enemy_armor
Enemy_weapondamage
Enemy_spelldamage
При изменении этих трех параметров будут изменятся урон и защита противников. Если хотите почувствовать себя богом просто поставьте все значения по нулям.
LifeRegenerationDelayTime время регенерации здоровья, как у вас так и у монстров. Так что если хотите затяжных боев поставьте поменьше.
Spawn_OffsetLow,
Spawn_OffsetHigh,
Spawn_FactorPM. — все три значения изменяют общую силу монстров. Повышать очень осторожно, если не хотите лишиться накопленного бонуса выживаемости.
Разное:
RangeDistance дистанция рэндж атаки. Не проверено, но вроде так и есть.
RangePickupLoot радиус круга, в котором собираются вещи. Довольно удобно кстати его сделать чуть больше.
PotionHealCooldown время восстановления зелья жизни. Вроде надо уменьшать.
SpeedMin =
SpeedMax = — скорость бега.
TopLevelCalc — максимальный уровень. Вот только не знаю, что будет после 200. Но все равно интересная фишка.
Дополнение от asud
Шансы дропа шмота,
ZRareExpectation15 = 2, — оранжевый
ZRareExpectation14 = 6, — коричневый первого сорта
ZRareExpectation13 = 14, — Зеленый (!!!) и коричневый второго сорта.
ZRareExpectation12 = 16,
ZRareExpectation11 = 24, — желтый
ZRareExpectation10 = 34,
ZRareExpectation09 = 46,
ZRareExpectation08 = 58, -синий
ZRareExpectation07 = 72,
ZRareExpectation06 = 88,
ZRareExpectation05 = 106,
ZRareExpectation04 = 124,
ZRareExpectation03 = 144,
ZRareExpectation02 = 166,
ZRareExpectation01 = 456, -прочее
ZRareExpectation00 = 1000,
Изменение урона оружия и зашиты брони (словом их первоначальных характеристик, а не бонусов)
ZRareBasepoints15 = 1350, — оранжевый
ZRareBasepoints14 = 1320, — коричневый первого сорта
ZRareBasepoints13 = 1290,- Зеленый (!!!) и коричневый второго сорта.
ZRareBasepoints12 = 1260,
ZRareBasepoints11 = 1230, — желтый
ZRareBasepoints10 = 1200,
ZRareBasepoints09 = 1175,
ZRareBasepoints08 = 1150, — синий
ZRareBasepoints07 = 1125,
ZRareBasepoints06 = 1100,
ZRareBasepoints05 = 1080,
ZRareBasepoints04 = 1060,
ZRareBasepoints03 = 1040, — белый
ZRareBasepoints02 = 1020,
ZRareBasepoints01 = 1000,
ZRareBasepoints00 = 750, — серый
DropMaxRandomRare = 13, — до какого класса дропаются предметы с обычных мобов (от 00 до 15 , 15 самые сочные уники)
SkillPivotPoint — уменьшить для ускорения восстановления магии. (By OSVal)
AdjustRegenFactor — отвечает за общее восстановление умений и магий в игре. Чем выше значение тем ниже перезарядка. Увеличивать осторожно, т.к. некоторые монстры также начинают пользоваться умениями постоянно (by Mokkun)
balance.txt
с исходными значениями.
Список будет дополняться.
Все настройки зависят от вас, если вы хотите чуть-чуть разнообразить игровой процесс, сделать его насыщеннее, сложнее, быстрее, разнообразнее, то изменяйте в меру.
Если вы хотите просто аналогов читов и трейнеров — то выставьте максимальные значения и пройдите игру за один день без всякого удовольствия. Все в ваших руках.
В данным момент командой камрадов, создаётся чит-редактор игры. Что бы вы хотели в нем увидеть?
Сообщение отредактировал Slayer: 18 Октябрь 2009 — 12:45