1. Основной класс мода (AwpMod.java)
Точка входа, регистрирует предмет и звуки.
```java
@Mod(AwpMod.MOD_ID)
public class AwpMod {
public static final String MOD_ID = "awpmod";
public static final RegistryObject<Item> AWP_ITEM =
DeferredRegister.create(ForgeRegistries.ITEMS, MOD_ID).register("awp", AwpItem::new);
public AwpMod() {
IEventBus bus = FMLJavaModLoadingContext.get().getModEventBus();
bus.addListener(this::commonSetup);
}
private void commonSetup(final FMLCommonSetupEvent event) { /* ... */ }
}
```
2. Класс винтовки (AwpItem.java)
Здесь реализована основная логика оружия.
```java
public class AwpItem extends Item {
private static final int COOLDOWN = 20; // 1 секунда
private static final float DAMAGE = 25.0F;
public AwpItem() {
super(new Properties().stacksTo(1).durability(100)
.tab(CreativeModeTab.TAB_COMBAT));
}
@Override
public ActionResult<ItemStack> use(Level world, Player player, InteractionHand hand) {
ItemStack stack = player.getItemInHand(hand);
if (!world.isClientSide) {
// Логика прицеливания (изменение FOV, замедление)
player.displayClientMessage(Component.literal("Прицеливание АКК"
, true);
}
return ActionResult.sidedSuccess(stack, world.isClientSide());
}
}
```
3. Обработчик событий (AwpEventHandler.java)
Отвечает за стрельбу по ЛКМ, если в руке AWP.
```java
@Mod.EventBusSubscriber(modid = AwpMod.MOD_ID)
public class AwpEventHandler {
@SubscribeEvent
public static void onLeftClick(InputEvent.InteractionKeyMappingTriggered event) {
Player player = Minecraft.getInstance().player;
if (player != null && player.getMainHandItem().getItem() instanceof AwpItem) {
if (!player.getCooldowns().isOnCooldown(player.getMainHandItem().getItem())) {
shootBullet(player); // Создаём снаряд
player.getCooldowns().addCooldown(player.getMainHandItem().getItem(), 20);
event.setSwingHand(false);
event.setCanceled(true);
}
}
}
private static void shootBullet(Player player) {
BulletEntity bullet = new BulletEntity(player.level(), player);
bullet.shootFromRotation(player, player.getXRot(), player.getYRot(), 0.0F, 3.0F, 0.5F);
player.level().addFreshEntity(bullet);
}
}
```
Обратите внимание: В новых версиях Forge InputEvent.InteractionKeyMappingTriggered — основной способ перехвата кликов. Для старых версий используется PlayerInteractEvent.LeftClickEmpty.
4. Класс пули (BulletEntity.java)
Снаряд, наносящий урон.
```java
public class BulletEntity extends AbstractArrow {
public BulletEntity(Level world, LivingEntity shooter) {
super(EntityType.ARROW, world);
this.setOwner(shooter);
this.setBaseDamage(25.0D);
this.setSoundEvent(SoundEvents.ARROW_SHOOT);
}
// Переопределите методы для кастомной модели и поведения
}
```
5. Добавление 3D-модели
Для отображения модели потребуется:
· Создать JSON-модель в assets/awpmod/models/item/awp.json и указать "parent": "builtin/entity".
· Написать класс рендера (AwpRenderer), который подгружает и отрисовывает .obj или .java модель. Это объемная задача, выходящая за рамки базового примера.
6. Важные моменты
· Прицеливание: Эффект FOV можно сделать через миксин или пакет, но проще всего временно изменить настройки камеры в клиентском обработчике.
· Анимация рук: Отключается через event.setSwingHand(false).
· Версия: Для 1.20.x используйте официальные маппинги (например, official или parchment).
Точка входа, регистрирует предмет и звуки.
```java
@Mod(AwpMod.MOD_ID)
public class AwpMod {
public static final String MOD_ID = "awpmod";
public static final RegistryObject<Item> AWP_ITEM =
DeferredRegister.create(ForgeRegistries.ITEMS, MOD_ID).register("awp", AwpItem::new);
public AwpMod() {
IEventBus bus = FMLJavaModLoadingContext.get().getModEventBus();
bus.addListener(this::commonSetup);
}
private void commonSetup(final FMLCommonSetupEvent event) { /* ... */ }
}
```
2. Класс винтовки (AwpItem.java)
Здесь реализована основная логика оружия.
```java
public class AwpItem extends Item {
private static final int COOLDOWN = 20; // 1 секунда
private static final float DAMAGE = 25.0F;
public AwpItem() {
super(new Properties().stacksTo(1).durability(100)
.tab(CreativeModeTab.TAB_COMBAT));
}
@Override
public ActionResult<ItemStack> use(Level world, Player player, InteractionHand hand) {
ItemStack stack = player.getItemInHand(hand);
if (!world.isClientSide) {
// Логика прицеливания (изменение FOV, замедление)
player.displayClientMessage(Component.literal("Прицеливание АКК"
}
return ActionResult.sidedSuccess(stack, world.isClientSide());
}
}
```
3. Обработчик событий (AwpEventHandler.java)
Отвечает за стрельбу по ЛКМ, если в руке AWP.
```java
@Mod.EventBusSubscriber(modid = AwpMod.MOD_ID)
public class AwpEventHandler {
@SubscribeEvent
public static void onLeftClick(InputEvent.InteractionKeyMappingTriggered event) {
Player player = Minecraft.getInstance().player;
if (player != null && player.getMainHandItem().getItem() instanceof AwpItem) {
if (!player.getCooldowns().isOnCooldown(player.getMainHandItem().getItem())) {
shootBullet(player); // Создаём снаряд
player.getCooldowns().addCooldown(player.getMainHandItem().getItem(), 20);
event.setSwingHand(false);
event.setCanceled(true);
}
}
}
private static void shootBullet(Player player) {
BulletEntity bullet = new BulletEntity(player.level(), player);
bullet.shootFromRotation(player, player.getXRot(), player.getYRot(), 0.0F, 3.0F, 0.5F);
player.level().addFreshEntity(bullet);
}
}
```
Обратите внимание: В новых версиях Forge InputEvent.InteractionKeyMappingTriggered — основной способ перехвата кликов. Для старых версий используется PlayerInteractEvent.LeftClickEmpty.
4. Класс пули (BulletEntity.java)
Снаряд, наносящий урон.
```java
public class BulletEntity extends AbstractArrow {
public BulletEntity(Level world, LivingEntity shooter) {
super(EntityType.ARROW, world);
this.setOwner(shooter);
this.setBaseDamage(25.0D);
this.setSoundEvent(SoundEvents.ARROW_SHOOT);
}
// Переопределите методы для кастомной модели и поведения
}
```
5. Добавление 3D-модели
Для отображения модели потребуется:
· Создать JSON-модель в assets/awpmod/models/item/awp.json и указать "parent": "builtin/entity".
· Написать класс рендера (AwpRenderer), который подгружает и отрисовывает .obj или .java модель. Это объемная задача, выходящая за рамки базового примера.
6. Важные моменты
· Прицеливание: Эффект FOV можно сделать через миксин или пакет, но проще всего временно изменить настройки камеры в клиентском обработчике.
· Анимация рук: Отключается через event.setSwingHand(false).
· Версия: Для 1.20.x используйте официальные маппинги (например, official или parchment).
