diff --git a/pom.xml b/pom.xml
index 48ca14e13d6390981fb5898d01f65f166782fb4c..a9e93fa1724cc43d609c2cb731854998a41b4dda 100644
--- a/pom.xml
+++ b/pom.xml
@@ -5,11 +5,11 @@
     <modelVersion>4.0.0</modelVersion>
 
     <groupId>org.awang05</groupId>
-    <artifactId>ballgame</artifactId>
+    <artifactId>nmoFootball</artifactId>
     <version>1.0.0-SNAPSHOT</version>
     <packaging>jar</packaging>
 
-    <name>ballgame</name>
+    <name>nmoFootball</name>
 
     <properties>
         <java.version>17</java.version>
diff --git a/src/main/java/org/awang05/ballGame/BallGame.java b/src/main/java/org/awang05/ballGame/BallGame.java
deleted file mode 100644
index ac0f4f2f764ad09a284561c77818a8dcc3d57b59..0000000000000000000000000000000000000000
--- a/src/main/java/org/awang05/ballGame/BallGame.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package org.awang05.ballGame;
-
-import org.bukkit.plugin.java.JavaPlugin;
-
-public final class BallGame extends JavaPlugin {
-
-    @Override
-    public void onEnable() {
-        // Plugin startup logic
-
-    }
-
-    @Override
-    public void onDisable() {
-        // Plugin shutdown logic
-    }
-}
diff --git a/src/main/java/org/awang05/nmoFootball/controller/ChargeController.java b/src/main/java/org/awang05/nmoFootball/controller/ChargeController.java
new file mode 100644
index 0000000000000000000000000000000000000000..87c109e419514b3f322fd0eb4cd507c5c04bfe7e
--- /dev/null
+++ b/src/main/java/org/awang05/nmoFootball/controller/ChargeController.java
@@ -0,0 +1,95 @@
+package org.awang05.nmoFootball.controller;
+
+import org.bukkit.entity.Player;
+import org.bukkit.plugin.Plugin;
+import org.bukkit.scheduler.BukkitRunnable;
+
+public class ChargeController {
+    private static float min= 0.6F;
+    private static float max= 3.6F;
+    private static float dx=0.1F;
+    private static int pause=10;
+
+    public static void setMin(float min){
+        ChargeController.min=min;
+    }
+    public static void setMax(float max){
+        ChargeController.max=max;
+    }
+    public static void setDx(float dx){
+        ChargeController.dx=dx;
+    }
+    public static void setPause(int pause){
+        ChargeController.pause=pause;
+    }
+
+    private float ad=-dx;
+    private float x=-1F;
+
+    private final Player player;
+    private int time=-1,time1=-1;
+    public ChargeController(Player p,Plugin plugin){
+        player=p;
+        new BukkitRunnable() {  //adder
+            @Override
+            public void run() {
+                if(!player.isOnline()){
+                    this.cancel();
+                    return;
+                }
+                if(x<0) return;
+                x+=ad;
+                if(x<0){
+                    player.setExp(0);
+                    x=-1;
+                }
+                else if(x>=1){
+                    x=1;
+                    player.setExp(1);
+                }
+                else {
+                    player.setExp(x);
+                }
+            }
+        }.runTaskTimer(plugin,0,2);
+
+        new BukkitRunnable(){   //timer
+            @Override
+            public void run() {
+                if(time<=0) return;
+                --time;
+                if (time==0){
+                    ad=0;
+                    time1=pause;
+                }
+            }
+        }.runTaskTimer(plugin,0,2);
+        new BukkitRunnable() {  //pause timer
+            @Override
+            public void run() {
+                if(ad!=0) return;
+                if(time1>0){
+                    time1-=2;
+                    return;
+                }
+                ad=-dx;
+            }
+        }.runTaskTimer(plugin,2,2);
+    }
+
+    public float getSpeed(){
+        if(x<=0) return min;
+        return min+x*(max-min);
+    }
+
+    public void press(){
+        ad=dx;
+        time=2;
+        if(x<0) x=0;
+    }
+
+    public void clear(){
+        x=-1;
+        player.setExp(0);
+    }
+}
diff --git a/src/main/java/org/awang05/nmoFootball/events/HitListener.java b/src/main/java/org/awang05/nmoFootball/events/HitListener.java
new file mode 100644
index 0000000000000000000000000000000000000000..b6f255f5f74f900a14654cc1626ffee5352f2b07
--- /dev/null
+++ b/src/main/java/org/awang05/nmoFootball/events/HitListener.java
@@ -0,0 +1,46 @@
+package org.awang05.nmoFootball.events;
+
+import org.awang05.nmoFootball.nmoFootball;
+import org.awang05.nmoFootball.controller.ChargeController;
+import org.bukkit.Material;
+import org.bukkit.entity.Chicken;
+import org.bukkit.entity.Entity;
+import org.bukkit.entity.Player;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.Listener;
+import org.bukkit.event.entity.EntityDamageByEntityEvent;
+import org.bukkit.event.player.PlayerInteractEvent;
+import org.bukkit.event.player.PlayerJoinEvent;
+
+import java.util.Dictionary;
+import java.util.Hashtable;
+
+public class HitListener implements Listener {
+    private final Dictionary<Player, ChargeController> ConDic=new Hashtable<>();
+    @EventHandler
+    public void OnJoin(PlayerJoinEvent event){
+        Player player=event.getPlayer();
+        ConDic.put(player,new ChargeController(player, nmoFootball.getProvidingPlugin(nmoFootball.class)));
+    }
+
+    @EventHandler
+    public void OnHit(EntityDamageByEntityEvent event){
+        Entity entity= event.getEntity();
+        if(!(entity instanceof Chicken)) return;
+        if(!(event.getDamager() instanceof Player player)) return;
+        event.setCancelled(true);
+        double speed=ConDic.get(player).getSpeed();
+        double x=player.getEyeLocation().getDirection().getX();
+        double z=player.getEyeLocation().getDirection().getZ();
+        entity.setVelocity(player.getEyeLocation().getDirection().setY(0.1).multiply(speed/Math.sqrt(x*x+z*z))); //灏嗛浮鍚戦潰鍚戞柟鍚戞墦鍑�
+        ConDic.get(player).clear();
+    }
+
+    @EventHandler
+    public void OnRight(PlayerInteractEvent event){
+        if(!event.getAction().isRightClick())return;
+        Player player= event.getPlayer();
+        if(player.getInventory().getItemInMainHand().getType()!= Material.STICK) return;
+        ConDic.get(player).press();
+    }
+}
diff --git a/src/main/java/org/awang05/nmoFootball/events/RecycleListener.java b/src/main/java/org/awang05/nmoFootball/events/RecycleListener.java
new file mode 100644
index 0000000000000000000000000000000000000000..780f3b2b7248f7ed692459ec7fa9dc09ef4dbc8f
--- /dev/null
+++ b/src/main/java/org/awang05/nmoFootball/events/RecycleListener.java
@@ -0,0 +1,30 @@
+package org.awang05.nmoFootball.events;
+
+import org.bukkit.Material;
+import org.bukkit.entity.Entity;
+import org.bukkit.entity.EntityType;
+import org.bukkit.entity.Player;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.Listener;
+import org.bukkit.event.player.PlayerMoveEvent;
+import org.bukkit.inventory.ItemStack;
+
+import java.util.List;
+
+public class RecycleListener implements Listener {
+    @EventHandler
+    public void onPlayerShift(PlayerMoveEvent event){
+        Player player= event.getPlayer();
+        if(player.isSneaking()&&player.getInventory().getItemInOffHand().getType()== Material.AIR){
+            List<Entity> entityList=player.getNearbyEntities(1,1,1);
+            for(Entity e:entityList){
+                if (e.getType()== EntityType.CHICKEN){
+                    ItemStack itemStack=new ItemStack(Material.EGG);
+                    player.getInventory().setItemInOffHand(itemStack);
+                    e.remove();
+                    return;
+                }
+            }
+        }
+    }
+}
diff --git a/src/main/java/org/awang05/nmoFootball/events/ThrowListener.java b/src/main/java/org/awang05/nmoFootball/events/ThrowListener.java
new file mode 100644
index 0000000000000000000000000000000000000000..d035ac3c8c53012f2fa10027f26876740c000a04
--- /dev/null
+++ b/src/main/java/org/awang05/nmoFootball/events/ThrowListener.java
@@ -0,0 +1,46 @@
+package org.awang05.nmoFootball.events;
+
+import org.bukkit.Location;
+import org.bukkit.Material;
+import org.bukkit.entity.Chicken;
+import org.bukkit.entity.EntityType;
+import org.bukkit.entity.Player;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.Listener;
+import org.bukkit.event.player.PlayerInteractEvent;
+import org.bukkit.inventory.ItemStack;
+import org.bukkit.potion.PotionEffect;
+import org.bukkit.potion.PotionEffectType;
+import org.bukkit.util.Vector;
+
+public class ThrowListener implements Listener {
+    @EventHandler
+    public void onPlayerInteract(PlayerInteractEvent event){
+        Player player= event.getPlayer();
+        ItemStack itemStack=player.getInventory().getItemInOffHand();
+        if(itemStack.getType()== Material.EGG&& !player.isSneaking()){
+            event.setCancelled(true);
+            Location eyeLocation=player.getEyeLocation();
+            Vector direction=eyeLocation.getDirection();
+            double x=direction.getX();
+            double z=direction.getZ();
+            final double sqrt = Math.sqrt(x * x + z * z);
+            double dx=x/ sqrt;
+            double dz=z/ sqrt;
+            eyeLocation.add(dx,0,dz);
+            Chicken entity= (Chicken) player.getWorld().spawnEntity(eyeLocation, EntityType.CHICKEN);
+            entity.setVelocity(new Vector(0,0.7,0));
+            entity.addPotionEffect(new PotionEffect(PotionEffectType.DAMAGE_RESISTANCE,1919810,4));
+            entity.addPotionEffect(new PotionEffect(PotionEffectType.SLOW,1919810,114513));
+            entity.addPotionEffect(new PotionEffect(PotionEffectType.JUMP,1919810,-114515));
+
+            int n=itemStack.getAmount();
+            if(n>1) {
+                itemStack.setAmount(n - 1);
+                player.getInventory().setItemInOffHand(itemStack);
+            }
+            else
+                player.getInventory().setItemInOffHand(null);
+        }
+    }
+}
diff --git a/src/main/java/org/awang05/nmoFootball/nmoFootball.java b/src/main/java/org/awang05/nmoFootball/nmoFootball.java
new file mode 100644
index 0000000000000000000000000000000000000000..f84824d5394297c98fb266eb21a4dadfb7fc7332
--- /dev/null
+++ b/src/main/java/org/awang05/nmoFootball/nmoFootball.java
@@ -0,0 +1,22 @@
+package org.awang05.nmoFootball;
+
+import org.awang05.nmoFootball.events.*;
+import org.bukkit.plugin.java.JavaPlugin;
+
+public final class nmoFootball extends JavaPlugin {
+
+    @Override
+    public void onEnable() {
+        // Plugin startup logic
+        getServer().getPluginManager().registerEvents(new RecycleListener(),this);
+        getServer().getPluginManager().registerEvents(new ThrowListener(),this);
+        getServer().getPluginManager().registerEvents(new HitListener(),this);
+
+        getLogger().info("nmoFootball鍚姩");
+    }
+
+    @Override
+    public void onDisable() {
+        // Plugin shutdown logic
+    }
+}
diff --git a/src/main/resources/paper-plugin.yml b/src/main/resources/paper-plugin.yml
deleted file mode 100644
index ca6632bd817c01dd7e9cd6c5083f903fa576e89e..0000000000000000000000000000000000000000
--- a/src/main/resources/paper-plugin.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-name: BallGame
-version: '1.0.0-SNAPSHOT'
-main: org.awang05.ballGame.BallGame
-api-version: '1.20'
diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml
new file mode 100644
index 0000000000000000000000000000000000000000..8c420beaf84ca2de7340e75cacc20807f764caf6
--- /dev/null
+++ b/src/main/resources/plugin.yml
@@ -0,0 +1,4 @@
+name: nmoFootball
+version: '1.0.0-SNAPSHOT'
+main: org.awang05.nmoFootball.nmoFootball
+api-version: '1.20'