mirror of
https://github.com/Grasscutters/Grasscutter.git
synced 2025-12-14 07:55:57 +01:00
Fix ore dropping and implement subfields
This commit is contained in:
committed by
KingRainbow44
parent
9dae3cbcc7
commit
56f09e87a1
@@ -1,5 +1,6 @@
|
||||
package emu.grasscutter.game.entity;
|
||||
|
||||
import emu.grasscutter.data.GameData;
|
||||
import emu.grasscutter.game.ability.*;
|
||||
import emu.grasscutter.game.player.Player;
|
||||
import emu.grasscutter.game.props.*;
|
||||
@@ -14,9 +15,10 @@ import emu.grasscutter.scripts.data.controller.EntityController;
|
||||
import emu.grasscutter.server.event.entity.*;
|
||||
import emu.grasscutter.server.packet.send.PacketEntityFightPropUpdateNotify;
|
||||
import it.unimi.dsi.fastutil.ints.*;
|
||||
import java.util.*;
|
||||
import lombok.*;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
public abstract class GameEntity {
|
||||
@Getter private final Scene scene;
|
||||
@Getter protected int id;
|
||||
@@ -226,6 +228,76 @@ public abstract class GameEntity {
|
||||
|
||||
public void onRemoved() {}
|
||||
|
||||
private int[] parseCountRange(String range) {
|
||||
var split = range.split(";");
|
||||
if(split.length == 1) return new int[] {Integer.parseInt(split[0]), Integer.parseInt(split[0])};
|
||||
return new int[] {Integer.parseInt(split[0]), Integer.parseInt(split[1])};
|
||||
}
|
||||
|
||||
public boolean dropSubfieldItem(int dropId) {
|
||||
var drop = GameData.getDropSubfieldMappingMap().get(dropId);
|
||||
if(drop == null) return false;
|
||||
var dropTableEntry = GameData.getDropTableExcelConfigDataMap().get(drop.getItemId());
|
||||
if(dropTableEntry == null) return false;
|
||||
|
||||
Int2ObjectMap<Integer> itemsToDrop = new Int2ObjectOpenHashMap<>();
|
||||
switch (dropTableEntry.getRandomType()) {
|
||||
case 0: //select one
|
||||
{
|
||||
int weightCount = 0;
|
||||
for(var entry : dropTableEntry.getDropVec()) weightCount += entry.getWeight();
|
||||
|
||||
int randomValue = new Random().nextInt(weightCount);
|
||||
|
||||
weightCount = 0;
|
||||
for(var entry : dropTableEntry.getDropVec()) {
|
||||
if(randomValue >= weightCount && randomValue < (weightCount + entry.getWeight())) {
|
||||
var countRange = parseCountRange(entry.getCountRange());
|
||||
itemsToDrop.put(entry.getItemId(), Integer.valueOf((new Random().nextBoolean() ? countRange[0] : countRange[1])));
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 1: //Select various
|
||||
{
|
||||
for(var entry : dropTableEntry.getDropVec()) {
|
||||
if(entry.getWeight() < new Random().nextInt(10000)) {
|
||||
var countRange = parseCountRange(entry.getCountRange());
|
||||
itemsToDrop.put(entry.getItemId(), Integer.valueOf((new Random().nextBoolean() ? countRange[0] : countRange[1])));
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
for (var entry : itemsToDrop.int2ObjectEntrySet()) {
|
||||
var item = new EntityItem(
|
||||
scene,
|
||||
null,
|
||||
GameData.getItemDataMap().get(entry.getIntKey()),
|
||||
getPosition().nearby2d(1f).addY(0.5f),
|
||||
entry.getValue(),
|
||||
true);
|
||||
|
||||
scene.addEntity(item);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public boolean dropSubfield(String subfieldName) {
|
||||
var subfieldMapping = GameData.getSubfieldMappingMap().get(getEntityTypeId());
|
||||
if (subfieldMapping == null || subfieldMapping.getSubfields() == null) return false;
|
||||
|
||||
for (var entry : subfieldMapping.getSubfields()) {
|
||||
if (entry.getSubfieldName().compareTo(subfieldName) == 0) {
|
||||
return dropSubfieldItem(entry.getDrop_id());
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public void onTick(int sceneTime) {
|
||||
if (entityController != null) {
|
||||
entityController.onTimer(this, sceneTime);
|
||||
|
||||
Reference in New Issue
Block a user