| 
		
	
	
	
		
	Posts: 29Threads: 3
 Joined: Mar 2022
 
	
		
		
		11-03-2024, 01:00 AM 
(This post was last modified: 11-03-2024, 01:30 AM by Tepe.)
	
	 
		Fantastic job, fantastic addition and works great! Unfortunately, I still have to correct the previous code regarding attacks on large events, because I don't know why, but a situation suddenly occurred where, even though the events are in the same group, they can attack each other. It doesn't mean that they approach each other and attack, because that's not the case, but if an event with id 1 enters the shot trajectories of another event with id 1, the latter surprisingly gets hit by its bullet. I've been struggling with this for a long time, but I haven't found a solution yet. By the way, I have the impression that sometimes when a projectile flies into an event and should hit an enemy who is in the same trajectory, it also hits the one who is passing by in the field, even though the event size is not set higher than 1x1. As for solving the problem of allies shooting at allies, on the other hand I have no idea how to deal with it. Well, in such a case, you would either have to remove the projectile after firing it when it touches an allied event and does not deal damage, or a better way is to set the projectile to penetrate when it touches an allied event, so that it flies through the ally and hits the enemy in front of it, or...
	 
	
	
	
		
	Posts: 11,566Threads: 672
 Joined: May 2009
 
	
	
		First, I just wanted to test that it wasn't the Immense Events... so, I made a new map, set two of your oversized goblins in it, set both the enemy ID 1 (the Bowers), set their hate group to 1 (yeah, they hate each other), set their view range to a good 15 and their behavior to 3 so seeing and hearing would be good. 
 And hehehe... the arrows began to fly.  Not one arrow hit their target as friendly fire works, even for immense events as shown here:
 
 [attachment=2703]
 
 The system checks if the arrow/projectile comes in contact with an event.  And only after coming in contact, it will check to see if the event is a player or enemy.  Well, putting it simply, anyway.  The arrow doesn't know what it is going to strike until it hits, and only then does it run the test.
 
 I put the player in harm's way in the above video, and he did get shot. So friendly fire seems to work.  You need to find a way to repeatedly recreate the issue and send a demo this way so it can be seen and evaluated.
 
Up is down, left is right and sideways is straight ahead. - Cord "Circle of Iron", 1978 (written by Bruce Lee and James Coburn... really...)
  Above are clickable links 
	
	
	
		
	Posts: 29Threads: 3
 Joined: Mar 2022
 
	
		
		
		11-03-2024, 05:57 PM 
(This post was last modified: 11-03-2024, 05:59 PM by Tepe.)
	
	 
		Okay, I made some progress, I analyzed your code again and I give you credit, it helped me again, although I still had to adjust it. The parent method that I introduced earlier caused an error that prevented smaller events from attacking, which could be attacked before I introduced the fix that allows large events to attack large events. Thus, I achieved the opposite situation xD. Finally, I managed to fix it. Now I have to adjust the pixelmovement that I use, plus solve the problem with allies attacking allies when they enter the trajectory of an ally's projectile. Here is the corrected version of the code: Code: #==============================================================================# ** MrMo's Immense Events Patch
 #------------------------------------------------------------------------------
 #    by DerVVulfman
 #    version 1.2
 #    10-30-2024
 #    RGSS / RPGMaker XP
 #
 #==============================================================================
 #
 #  INSTALLATION:
 #
 #  The Immense Events script must be below MrMo's ABS.
 #  This patch goes below both.
 #  Par-tay!
 #
 #------------------------------------------------------------------------------
 #
 #  USAGE:
 #
 #  Apply the 'size' command used by Immense Events to the 'first page' in any
 #  enemy event.  The size is only defined once for any event and won't reset.
 #  Using the 'size' command multiple times for an event changing its graphics
 #  will not function.
 #
 #------------------------------------------------------------------------------
 
 
 #==============================================================================
 # ** MrMo_ABS
 #------------------------------------------------------------------------------
 #  This class deals with the Action Battle System and controls all Player,
 #  Enemy and Companion Actions on the map.
 #==============================================================================
 
 class MrMo_ABS
 #--------------------------------------------------------------------------
 # * In Direction?(source, target) - Near Fantastica
 #    source : source of search (object performing test)
 #    target : target of search (object being searched)
 #--------------------------------------------------------------------------
 def in_direction?(source, target)
 #
 # Obtain size differences
 change          = get_size(target)
 o_ch_x, o_ch_y  = change[0], change[1]
 #
 # Get facing direction of seearch source
 dir = source.direction
 #
 # Cycle through object/target x coordinates
 for x in (target.x - o_ch_x)..(target.x + o_ch_x)
 # Return with success based on diretion and coordinates
 return true if dir == 2 and source.y <= target.y and source.x == x
 return true if dir == 8 and source.y >= target.y and source.x == x
 end
 #
 # Cycle through object/target y coordinates
 for y in (target.y - o_ch_y)..(target.y)
 # Return with success based on diretion and coordinates
 return true if dir == 4 and source.x >= target.x and source.y == y
 return true if dir == 6 and source.x <= target.x and source.y == y
 end
 #
 # Return failed
 return false
 #
 end
 #--------------------------------------------------------------------------
 # * In Range?(Element, Object, Range) - Near Fantastica
 #    source : source of search (object performing test)
 #    target : target of search (object being searched)
 #    range  : range distance in tiles
 #--------------------------------------------------------------------------
 def in_range?(source, target, range)
 #
 # Get differences
 change          = get_size(source)
 s_ch_x, s_ch_y  = change[0], change[1]
 change          = get_size(target)
 t_ch_x, t_ch_y  = change[0], change[1]
 #
 # Loop through source and target coordinates with tile extensions
 for xs in (source.x - s_ch_x)..(source.x + s_ch_x)
 for xt in (target.x - t_ch_x)..(target.x + t_ch_x)
 for ys in (source.y - s_ch_y)..(source.y)
 for yt in (target.y - t_ch_y)..(target.y)
 #
 # Confirm if updated coordinate are within the range test
 return true if in_range_numeric?(xs, ys, xt, yt, range)
 #
 end
 end
 end
 end
 #
 # Exit method with no confirmation
 return false
 #
 end
 #--------------------------------------------------------------------------
 # * In Range based on given values (variant of Near Fantastica's)
 #    s_x  : source object's x-coordinates
 #    s_y  : source object's y-coordinates
 #    t_x  : target object's x-coordinates
 #    t_y  : target object's y-coordinates
 #    range : range distance in tiles
 #--------------------------------------------------------------------------
 def in_range_numeric?(s_x, s_y, t_x, t_y, range)
 #
 x = (s_x - t_x) * (s_x - t_x)
 y = (s_y - t_y) * (s_y - t_y)
 r = x + y
 return true if r <= (range * range)
 return false
 #
 end
 #--------------------------------------------------------------------------
 # * Obtain extending tile quantity (size) based on facing direction
 #    t : target object character
 #--------------------------------------------------------------------------
 def get_size(t)
 #
 # Get facing direction of target
 d = t.direction
 #
 # Set the size variables depending on the direction
 t_x = ((d == 2 or d == 8) ? t.vertical_size_x : t.horizontal_size_x).to_i
 t_y = ((d == 2 or d == 8) ? t.vertical_size_y : t.horizontal_size_y).to_i
 #
 # Work out the number of tiles either side of the event
 t_x /= 2
 t_y -= 1
 #
 # Return array with horizontal and vertical tile extensions
 return [t_x, t_y]
 #
 end
 end
 
 
 
 #==============================================================================
 # ** Range_Base
 #------------------------------------------------------------------------------
 #  This class handles missiles fired in battle. It's used within the ABS Engine
 #  and is a superclass for both Game_Ranged_Weapon and Game_Ranged_Skill.
 #==============================================================================
 
 class Range_Base < Game_Character
 #--------------------------------------------------------------------------
 # * In Range?(Element, Object, Range) - Near Fantastica
 #    source : source of search (object performing test)
 #    target : target of search (object being searched)
 #    range  : range distance in tiles
 #--------------------------------------------------------------------------
 def in_range_ballistic?(x, y, target, range)
 #
 # Exit false if ballistic strikes parent/attacker
 return false if @parent == target && @parent == $game_player
 #
 # Get differences
 change          = $ABS.get_size(target)
 t_ch_x, t_ch_y  = change[0], change[1]
 #
 # Loop through source and target coordinates with tile extensions
 for xt in (target.x - t_ch_x)..(target.x + t_ch_x)
 for yt in (target.y - t_ch_y)..(target.y)
 #
 # Confirm if updated coordinate are within the range test
 return true if $ABS.in_range_numeric?(x, y, xt, yt, range)
 #
 end
 end
 #
 # Exit method with no confirmation
 return false
 #
 end
 end
 
 
 
 #==============================================================================
 # ** Game_Ranged_Skill
 #------------------------------------------------------------------------------
 #  This class handles ranged missiles that deliver damage based on the skill
 #  performed by the user.
 #==============================================================================
 
 class Game_Ranged_Skill < Range_Base
 #--------------------------------------------------------------------------
 # * Frame Update
 #--------------------------------------------------------------------------
 def update
 super
 check_event_trigger_touch(@x, @y)
 end
 
 #--------------------------------------------------------------------------
 # * Check Event Trigger Touch(x, y)
 #--------------------------------------------------------------------------
 def check_event_trigger_touch(x, y)
 #
 # If using non-official update to 4.5
 faux = (Object.const_defined?(:DEFEND_DAMAGE_PERCENT))
 #
 # Exit if the stop flag is set
 return if @stop
 #
 if faux
 # Exit and set stop flag if neither an enemy nor player
 if $ABS.enemies[@parent.id].nil? && !@parent.is_a?(Game_Player)
 return @stop = true
 end
 end
 #
 # Hit the player if missile in range of the player
 hit_player if in_range_ballistic?(x, y, $game_player, 1)
 #
 # Cycle through all map events
 for event in $game_map.events.values
 #
 # Skip if not an enemy, or missile not in range to strike or the same as parent
 next if $ABS.enemies[event.id].nil?
 next unless in_range_ballistic?(x, y, event, 1)
 #
 # Acquire hit condition tests
 if faux
 # Adding unofficial friendly-fire option
 hate    = true
 unless $ABS.enemies[@parent.id].nil?
 e_id  = $ABS.enemies[event.id].enemy_id
 hate  = $ABS.enemies[@parent.id].hate_group.include?(e_id)
 end
 end
 #
 # Check hit conditions
 c1 = event.character_name == ""
 c2 = ($ABS.enemies[event.id] != nil && $ABS.enemies[event.id].dead?)
 c3 = event.erased
 c4 = @parent.is_a?(Game_Event) && !hate
 #
 # If hit condition not met, perform movement
 if (c1 || c2 || c3) && !faux
 force_movement
 elsif (c1 || c2 || c3 || c4) && faux
 force_movement
 else
 # Hit the event
 hit_event(event.id)
 end
 end
 end
 end
 
 #==============================================================================
 # ** Game_Ranged_Weapon
 #------------------------------------------------------------------------------
 #  This class handles ranged missiles that deliver damage based on the weapon
 #  currently equipped.
 #==============================================================================
 
 class Game_Ranged_Weapon < Range_Base
 #--------------------------------------------------------------------------
 # * Check Event Trigger Touch(x, y)
 #--------------------------------------------------------------------------
 def check_event_trigger_touch(x, y)
 #
 # If using non-official update to 4.5
 faux = (Object.const_defined?(:DEFEND_DAMAGE_PERCENT))
 #
 # Exit if the stop flag is set
 return if @stop
 #
 if faux
 # Exit and set stop flag if neither an enemy nor player
 if $ABS.enemies[@parent.id].nil? && !@parent.is_a?(Game_Player)
 return @stop = true
 end
 end
 #
 # Hit the player if missile in range of the player
 hit_player if in_range_ballistic?(x, y, $game_player, 1)
 #
 # Cycle through all map events
 for event in $game_map.events.values
 #
 # Skip if not an enemy, or missile not in range to strike or the same as parent
 next if $ABS.enemies[event.id].nil?
 next unless in_range_ballistic?(x, y, event, 1)
 #
 # Acquire hit condition tests
 if faux
 # Adding unofficial friendly-fire option
 hate = true
 unless $ABS.enemies[@parent.id].nil?
 e_id = $ABS.enemies[event.id].enemy_id
 hate = $ABS.enemies[@parent.id].hate_group.include?(e_id)
 end
 end
 #
 # Check hit conditions
 c1 = event.character_name == ""
 c2 = ($ABS.enemies[event.id] != nil && $ABS.enemies[event.id].dead?)
 c3 = event.erased
 c4 = @parent.is_a?(Game_Event) && !hate
 #
 # Move if hit condition not met, or perform hit
 if (c1 || c2 || c3) && !faux
 force_movement
 elsif (c1 || c2 || c3 || c4) && faux
 force_movement
 else
 hit_event(event.id)
 end
 #
 end
 end
 end
 |