--- a/net/minecraft/world/level/block/TripWireBlock.java
+++ b/net/minecraft/world/level/block/TripWireBlock.java
@@ -72,6 +_,7 @@
 
     @Override
     public BlockState getStateForPlacement(BlockPlaceContext context) {
+        if (io.papermc.paper.configuration.GlobalConfiguration.get().blockUpdates.disableTripwireUpdates) return this.defaultBlockState(); // Paper - place tripwire without updating
         BlockGetter level = context.getLevel();
         BlockPos clickedPos = context.getClickedPos();
         return this.defaultBlockState()
@@ -92,6 +_,7 @@
         BlockState neighborState,
         RandomSource random
     ) {
+        if (io.papermc.paper.configuration.GlobalConfiguration.get().blockUpdates.disableTripwireUpdates) return state; // Paper - prevent tripwire from updating
         return direction.getAxis().isHorizontal()
             ? state.setValue(PROPERTY_BY_DIRECTION.get(direction), Boolean.valueOf(this.shouldConnectTo(neighborState, direction)))
             : super.updateShape(state, level, scheduledTickAccess, pos, direction, neighborPos, neighborState, random);
@@ -99,6 +_,7 @@
 
     @Override
     protected void onPlace(BlockState state, Level level, BlockPos pos, BlockState oldState, boolean isMoving) {
+        if (io.papermc.paper.configuration.GlobalConfiguration.get().blockUpdates.disableTripwireUpdates) return; // Paper - prevent adjacent tripwires from updating
         if (!oldState.is(state.getBlock())) {
             this.updateSource(level, pos, state);
         }
@@ -106,6 +_,7 @@
 
     @Override
     protected void onRemove(BlockState state, Level level, BlockPos pos, BlockState newState, boolean isMoving) {
+        if (io.papermc.paper.configuration.GlobalConfiguration.get().blockUpdates.disableTripwireUpdates) return; // Paper - prevent adjacent tripwires from updating
         if (!isMoving && !state.is(newState.getBlock())) {
             this.updateSource(level, pos, state.setValue(POWERED, Boolean.valueOf(true)));
         }
@@ -113,6 +_,7 @@
 
     @Override
     public BlockState playerWillDestroy(Level level, BlockPos pos, BlockState state, Player player) {
+        if (io.papermc.paper.configuration.GlobalConfiguration.get().blockUpdates.disableTripwireUpdates) return state; // Paper - prevent disarming tripwires
         if (!level.isClientSide && !player.getMainHandItem().isEmpty() && player.getMainHandItem().is(Items.SHEARS)) {
             level.setBlock(pos, state.setValue(DISARMED, Boolean.valueOf(true)), 4);
             level.gameEvent(player, GameEvent.SHEAR, pos);
@@ -122,6 +_,7 @@
     }
 
     private void updateSource(Level level, BlockPos pos, BlockState state) {
+        if (io.papermc.paper.configuration.GlobalConfiguration.get().blockUpdates.disableTripwireUpdates) return; // Paper - prevent adjacent tripwires from updating
         for (Direction direction : new Direction[]{Direction.SOUTH, Direction.WEST}) {
             for (int i = 1; i < 42; i++) {
                 BlockPos blockPos = pos.relative(direction, i);
@@ -147,6 +_,8 @@
 
     @Override
     protected void entityInside(BlockState state, Level level, BlockPos pos, Entity entity) {
+        if (io.papermc.paper.configuration.GlobalConfiguration.get().blockUpdates.disableTripwireUpdates) return; // Paper - prevent tripwires from detecting collision
+        if (!new io.papermc.paper.event.entity.EntityInsideBlockEvent(entity.getBukkitEntity(), org.bukkit.craftbukkit.block.CraftBlock.at(level, pos)).callEvent()) { return; } // Paper - Add EntityInsideBlockEvent
         if (!level.isClientSide) {
             if (!state.getValue(POWERED)) {
                 this.checkPressed(level, pos, List.of(entity));
@@ -156,6 +_,7 @@
 
     @Override
     protected void tick(BlockState state, ServerLevel level, BlockPos pos, RandomSource random) {
+        if (io.papermc.paper.configuration.GlobalConfiguration.get().blockUpdates.disableTripwireUpdates) return; // Paper - prevent tripwire pressed check
         if (level.getBlockState(pos).getValue(POWERED)) {
             this.checkPressed(level, pos);
         }
@@ -179,6 +_,40 @@
                 }
             }
         }
+
+        // CraftBukkit start - Call interact even when triggering connected tripwire
+        if (poweredValue != flag && flag && blockState.getValue(TripWireBlock.ATTACHED)) {
+            org.bukkit.World bworld = level.getWorld();
+            org.bukkit.plugin.PluginManager manager = level.getCraftServer().getPluginManager();
+            org.bukkit.block.Block block = bworld.getBlockAt(pos.getX(), pos.getY(), pos.getZ());
+            boolean allowed = false;
+
+            // If all the events are cancelled block the tripwire trigger, else allow
+            for (Object object : entities) {
+                if (object != null) {
+                    org.bukkit.event.Cancellable cancellable;
+
+                    if (object instanceof Player) {
+                        cancellable = org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerInteractEvent((Player) object, org.bukkit.event.block.Action.PHYSICAL, pos, null, null, null);
+                    } else if (object instanceof Entity) {
+                        cancellable = new org.bukkit.event.entity.EntityInteractEvent(((Entity) object).getBukkitEntity(), block);
+                        manager.callEvent((org.bukkit.event.entity.EntityInteractEvent) cancellable);
+                    } else {
+                        continue;
+                    }
+
+                    if (!cancellable.isCancelled()) {
+                        allowed = true;
+                        break;
+                    }
+                }
+            }
+
+            if (!allowed) {
+                return;
+            }
+        }
+        // CraftBukkit end
 
         if (flag != poweredValue) {
             blockState = blockState.setValue(POWERED, Boolean.valueOf(flag));
