feat: add initial People Playground mod development kit
This commit is contained in:
35
mods/SledgeHammer-Enhanced/README.txt
Normal file
35
mods/SledgeHammer-Enhanced/README.txt
Normal file
@@ -0,0 +1,35 @@
|
||||
SledgeHammer-Enhanced
|
||||
====================
|
||||
|
||||
An upgraded version of the classic sledgehammer with enhanced physics, visual effects, and audio feedback.
|
||||
|
||||
Enhanced Features
|
||||
----------------
|
||||
• Improved weight and impact physics
|
||||
• Enhanced visual effects on impact
|
||||
• Realistic sound effects
|
||||
• Better handling and swing mechanics
|
||||
• Particle effects on collision
|
||||
|
||||
Advanced Functionality
|
||||
--------------------
|
||||
• Dynamic damage based on swing velocity
|
||||
• Environmental interaction effects
|
||||
• Enhanced durability system
|
||||
• Custom impact sounds for different surfaces
|
||||
|
||||
Usage Instructions
|
||||
------------------
|
||||
1. Enable the mod in your mod manager
|
||||
2. Locate the enhanced sledgehammer in the weapons section
|
||||
3. Experiment with different swing speeds for varied effects
|
||||
4. Try hitting different objects to see unique reactions
|
||||
|
||||
Technical Improvements
|
||||
---------------------
|
||||
This enhanced version demonstrates:
|
||||
• Advanced physics calculations
|
||||
• Multi-sprite object implementation
|
||||
• Custom sound effect integration
|
||||
• Particle system utilization
|
||||
• Event-driven impact detection
|
||||
17
mods/SledgeHammer-Enhanced/mod.json
Normal file
17
mods/SledgeHammer-Enhanced/mod.json
Normal file
@@ -0,0 +1,17 @@
|
||||
{
|
||||
"Name": "Enhanced SledgeHammer",
|
||||
"Author": "Nuclear.Lab",
|
||||
"Description": "A powerful sledgehammer with realistic physics, heavy impact damage, and enhanced visual effects. Perfect for demolition and mayhem!",
|
||||
"ModVersion": "1.0",
|
||||
"GameVersion": "1.27.5",
|
||||
"ThumbnailPath": "thumb.png",
|
||||
"EntryPoint": "Mod.Mod",
|
||||
"Tags": [
|
||||
"Fun",
|
||||
"Weapons",
|
||||
"Melee"
|
||||
],
|
||||
"Scripts": [
|
||||
"script.cs"
|
||||
]
|
||||
}
|
||||
431
mods/SledgeHammer-Enhanced/script.cs
Normal file
431
mods/SledgeHammer-Enhanced/script.cs
Normal file
@@ -0,0 +1,431 @@
|
||||
using UnityEngine;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Mod
|
||||
{
|
||||
public class Mod
|
||||
{
|
||||
public static void OnLoad()
|
||||
{
|
||||
// Optional initialization method - runs when mod is first loaded
|
||||
}
|
||||
|
||||
public static void OnUnload()
|
||||
{
|
||||
// Optional cleanup method - runs when mod is unloaded/game closes
|
||||
}
|
||||
|
||||
public static void Main()
|
||||
{
|
||||
try
|
||||
{
|
||||
// Register the enhanced sledgehammer to the mod api
|
||||
ModAPI.Register(
|
||||
new Modification()
|
||||
{
|
||||
OriginalItem = ModAPI.FindSpawnable("Power Hammer"), // Use Power Hammer as base for better physics
|
||||
NameOverride = "Enhanced SledgeHammer",
|
||||
DescriptionOverride = "A massive demolition sledgehammer with devastating impact force and realistic physics.",
|
||||
CategoryOverride = ModAPI.FindCategory("Melee"),
|
||||
ThumbnailOverride = ModAPI.LoadSprite("sledgeHammerView.png"),
|
||||
AfterSpawn = (Instance) =>
|
||||
{
|
||||
try
|
||||
{
|
||||
SetupEnhancedSledgeHammer(Instance);
|
||||
}
|
||||
catch (System.Exception ex)
|
||||
{
|
||||
Debug.LogError($"Enhanced SledgeHammer setup error: {ex.Message}");
|
||||
}
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
catch (System.Exception ex)
|
||||
{
|
||||
Debug.LogError($"Enhanced SledgeHammer mod loading error: {ex.Message}");
|
||||
}
|
||||
}
|
||||
|
||||
private static void SetupEnhancedSledgeHammer(GameObject Instance)
|
||||
{
|
||||
// Replace the sprite with our custom sledgehammer
|
||||
var spriteRenderer = Instance.GetComponent<SpriteRenderer>();
|
||||
if (spriteRenderer != null)
|
||||
{
|
||||
var customSprite = ModAPI.LoadSprite("sledgeHammer.png");
|
||||
if (customSprite != null)
|
||||
{
|
||||
spriteRenderer.sprite = customSprite;
|
||||
}
|
||||
}
|
||||
|
||||
// Enhance the physical properties using the correct API from the tutorial
|
||||
var physical = Instance.GetComponent<PhysicalBehaviour>();
|
||||
if (physical != null)
|
||||
{
|
||||
// Set mass properties (from tutorial - these are the correct properties)
|
||||
physical.InitialMass = 8f; // Heavy mass for a sledgehammer
|
||||
physical.TrueInitialMass = 8f; // Make it actually heavy
|
||||
|
||||
// Set metal properties for durability
|
||||
physical.Properties = ModAPI.FindPhysicalProperties("Metal");
|
||||
|
||||
// Set temperature properties
|
||||
physical.Temperature = 25f;
|
||||
physical.SimulateTemperature = true;
|
||||
physical.AmbientTemperatureTransfer = true;
|
||||
}
|
||||
|
||||
// Add heavy feel with gravity and physics
|
||||
var rb = Instance.GetComponent<Rigidbody2D>();
|
||||
if (rb != null)
|
||||
{
|
||||
rb.gravityScale = 1.2f; // Slightly heavier gravity
|
||||
rb.drag = 0.5f; // Some air resistance
|
||||
rb.angularDrag = 0.8f; // Angular resistance
|
||||
|
||||
// Create and assign a physics material
|
||||
var physicsMaterial = new PhysicsMaterial2D("Metal");
|
||||
physicsMaterial.friction = 0.4f;
|
||||
physicsMaterial.bounciness = 0.1f;
|
||||
rb.sharedMaterial = physicsMaterial;
|
||||
}
|
||||
|
||||
// Add enhanced damage using limb damage multipliers (from tutorial)
|
||||
var limb = Instance.GetComponent<LimbBehaviour>();
|
||||
if (limb != null)
|
||||
{
|
||||
limb.ImpactDamageMultiplier = 3.0f; // 3x damage on impact
|
||||
limb.ShotDamageMultiplier = 1.5f; // 1.5x damage from shots
|
||||
}
|
||||
|
||||
// Add impact behavior
|
||||
if (Instance.GetComponent<EnhancedSledgeHammerBehaviour>() == null)
|
||||
{
|
||||
Instance.AddComponent<EnhancedSledgeHammerBehaviour>();
|
||||
}
|
||||
|
||||
// Fix colliders to match new sprite
|
||||
Instance.FixColliders();
|
||||
|
||||
Debug.Log("Enhanced SledgeHammer setup completed successfully!");
|
||||
}
|
||||
}
|
||||
|
||||
// Custom behavior for enhanced sledgehammer
|
||||
public class EnhancedSledgeHammerBehaviour : MonoBehaviour
|
||||
{
|
||||
private float lastImpactTime;
|
||||
private int comboCount;
|
||||
private bool isChargedUp = false;
|
||||
private float chargeStartTime;
|
||||
private PhysicalBehaviour physical;
|
||||
private SpriteRenderer spriteRenderer;
|
||||
private Color originalColor;
|
||||
private bool isBeingHeld = false;
|
||||
private AudioSource audioSource;
|
||||
|
||||
private void Awake()
|
||||
{
|
||||
physical = GetComponent<PhysicalBehaviour>();
|
||||
spriteRenderer = GetComponent<SpriteRenderer>();
|
||||
if (spriteRenderer != null)
|
||||
{
|
||||
originalColor = spriteRenderer.color;
|
||||
}
|
||||
|
||||
// Add audio source for custom sounds
|
||||
audioSource = gameObject.AddComponent<AudioSource>();
|
||||
audioSource.volume = 0.8f;
|
||||
audioSource.pitch = 0.7f; // Deep, heavy sound
|
||||
}
|
||||
|
||||
private void OnCollisionEnter2D(Collision2D collision)
|
||||
{
|
||||
float impactForce = collision.relativeVelocity.magnitude;
|
||||
|
||||
// Create impact particles when hitting something with significant force
|
||||
if (impactForce > 5f)
|
||||
{
|
||||
HandleImpactEffects(collision, impactForce);
|
||||
HandleDamageAndDestruction(collision, impactForce);
|
||||
HandleSpecialAbilities(collision, impactForce);
|
||||
HandleImpactSounds(impactForce);
|
||||
}
|
||||
}
|
||||
|
||||
private void HandleImpactEffects(Collision2D collision, float impactForce)
|
||||
{
|
||||
var hitPoint = collision.GetContact(0).point;
|
||||
|
||||
// Create different particle effects based on impact force
|
||||
if (impactForce > 20f)
|
||||
{
|
||||
// Devastating impact - massive explosion
|
||||
CreateDevastatingImpact(hitPoint);
|
||||
}
|
||||
else if (impactForce > 15f)
|
||||
{
|
||||
// High impact - create explosion particles
|
||||
SafeCreateParticleEffect("Spark", hitPoint);
|
||||
SafeCreateParticleEffect("ConcreteChunk", hitPoint);
|
||||
SafeCreateParticleEffect("MetalSpark", hitPoint);
|
||||
|
||||
// Add camera shake for powerful impacts
|
||||
AddCameraShake(impactForce, hitPoint);
|
||||
}
|
||||
else if (impactForce > 10f)
|
||||
{
|
||||
// Medium-high impact
|
||||
SafeCreateParticleEffect("Spark", hitPoint);
|
||||
SafeCreateParticleEffect("ConcreteChunk", hitPoint);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Medium impact - just sparks
|
||||
SafeCreateParticleEffect("Spark", hitPoint);
|
||||
}
|
||||
|
||||
// Create shockwave for very powerful impacts
|
||||
if (impactForce > 18f)
|
||||
{
|
||||
CreateShockwave(hitPoint, impactForce);
|
||||
}
|
||||
}
|
||||
|
||||
private void HandleImpactSounds(float impactForce)
|
||||
{
|
||||
// Play custom impact sound based on force
|
||||
if (impactForce > 15f && audioSource != null)
|
||||
{
|
||||
// Create a simple impact sound programmatically
|
||||
audioSource.pitch = Mathf.Lerp(0.5f, 1.0f, impactForce / 30f);
|
||||
audioSource.Play();
|
||||
}
|
||||
}
|
||||
|
||||
private void HandleDamageAndDestruction(Collision2D collision, float impactForce)
|
||||
{
|
||||
// Enhance damage to humans using the correct method from tutorial
|
||||
var person = collision.collider.GetComponent<PersonBehaviour>();
|
||||
if (person != null && impactForce > 8f)
|
||||
{
|
||||
HandleHumanImpact(collision, impactForce);
|
||||
}
|
||||
|
||||
// Break joints with sufficient force
|
||||
var joint = collision.collider.GetComponent<Joint>();
|
||||
if (joint != null && impactForce > 10f)
|
||||
{
|
||||
Destroy(joint);
|
||||
}
|
||||
|
||||
// Destroy weak objects instantly
|
||||
if (impactForce > 15f)
|
||||
{
|
||||
// Check if it's a breakable object by trying to disintegrate it
|
||||
var targetPhysical = collision.collider.GetComponent<PhysicalBehaviour>();
|
||||
if (targetPhysical != null && impactForce > 20f)
|
||||
{
|
||||
// High force can disintegrate objects
|
||||
targetPhysical.Disintegrate();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void HandleSpecialAbilities(Collision2D collision, float impactForce)
|
||||
{
|
||||
// Combo system - rapid successive hits increase power
|
||||
float timeSinceLastImpact = Time.time - lastImpactTime;
|
||||
if (timeSinceLastImpact < 2f)
|
||||
{
|
||||
comboCount++;
|
||||
if (comboCount > 3)
|
||||
{
|
||||
// Combo bonus - create additional effects
|
||||
var hitPoint = collision.GetContact(0).point;
|
||||
for (int i = 0; i < 3; i++)
|
||||
{
|
||||
SafeCreateParticleEffect("Spark", hitPoint + Random.insideUnitCircle * 0.5f);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
comboCount = 0;
|
||||
}
|
||||
|
||||
lastImpactTime = Time.time;
|
||||
}
|
||||
|
||||
private void HandleHumanImpact(Collision2D collision, float impactForce)
|
||||
{
|
||||
var hitPoint = collision.GetContact(0).point;
|
||||
|
||||
// Create blood effects
|
||||
SafeCreateParticleEffect("Blood", hitPoint);
|
||||
SafeCreateParticleEffect("BloodMist", hitPoint);
|
||||
|
||||
// High force can affect limbs - use the limb component
|
||||
if (impactForce > 20f)
|
||||
{
|
||||
var limb = collision.collider.GetComponent<LimbBehaviour>();
|
||||
if (limb != null)
|
||||
{
|
||||
// Severe damage to limb
|
||||
limb.Crush();
|
||||
limb.BreakBone();
|
||||
|
||||
// Very high force can dismember - handled by explosion effects and game engine
|
||||
// No explicit dismemberment call needed
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void CreateDevastatingImpact(Vector2 hitPoint)
|
||||
{
|
||||
// Create multiple particle effects
|
||||
for (int i = 0; i < 5; i++)
|
||||
{
|
||||
SafeCreateParticleEffect("Spark", hitPoint + Random.insideUnitCircle * 1f);
|
||||
}
|
||||
SafeCreateParticleEffect("ConcreteChunk", hitPoint);
|
||||
SafeCreateParticleEffect("MetalSpark", hitPoint);
|
||||
SafeCreateParticleEffect("Explosion", hitPoint);
|
||||
|
||||
// Strong camera shake
|
||||
AddCameraShake(25f, hitPoint);
|
||||
|
||||
// Create a powerful shockwave
|
||||
CreateShockwave(hitPoint, 25f);
|
||||
|
||||
// Notification for devastating hit
|
||||
ModAPI.Notify("DEVASTATING IMPACT!");
|
||||
}
|
||||
|
||||
private void CreateShockwave(Vector2 hitPoint, float impactForce)
|
||||
{
|
||||
try
|
||||
{
|
||||
ExplosionCreator.Explode(new ExplosionCreator.ExplosionParameters
|
||||
{
|
||||
Position = hitPoint,
|
||||
CreateParticlesAndSound = true,
|
||||
LargeExplosionParticles = impactForce > 20f,
|
||||
DismemberChance = Mathf.Clamp01(impactForce * 0.02f),
|
||||
FragmentForce = Mathf.Min(impactForce * 0.4f, 12f),
|
||||
FragmentationRayCount = (uint)Mathf.Clamp((int)(impactForce * 2f), 16, 64),
|
||||
Range = Mathf.Min(impactForce * 0.3f, 10f)
|
||||
});
|
||||
}
|
||||
catch (System.Exception ex)
|
||||
{
|
||||
Debug.LogWarning($"Failed to create shockwave: {ex.Message}");
|
||||
}
|
||||
}
|
||||
|
||||
private void AddCameraShake(float impactForce, Vector3 position)
|
||||
{
|
||||
try
|
||||
{
|
||||
var cameraShake = CameraShakeBehaviour.main;
|
||||
if (cameraShake != null)
|
||||
{
|
||||
float shakeIntensity = Mathf.Clamp(impactForce * 0.03f, 0.1f, 0.8f);
|
||||
cameraShake.Shake(shakeIntensity, position);
|
||||
}
|
||||
}
|
||||
catch (System.Exception ex)
|
||||
{
|
||||
Debug.LogWarning($"Failed to add camera shake: {ex.Message}");
|
||||
}
|
||||
}
|
||||
|
||||
private void SafeCreateParticleEffect(string effectName, Vector2 position)
|
||||
{
|
||||
try
|
||||
{
|
||||
ModAPI.CreateParticleEffect(effectName, position);
|
||||
}
|
||||
catch (System.Exception ex)
|
||||
{
|
||||
Debug.LogWarning($"Failed to create particle effect {effectName}: {ex.Message}");
|
||||
}
|
||||
}
|
||||
|
||||
private void Update()
|
||||
{
|
||||
// Check for charge-up mechanic (holding the item for extended time)
|
||||
if (physical != null)
|
||||
{
|
||||
// Use the correct property name from the API
|
||||
isBeingHeld = physical.beingHeldByGripper;
|
||||
|
||||
if (isBeingHeld)
|
||||
{
|
||||
if (Time.time - chargeStartTime > 3f && !isChargedUp)
|
||||
{
|
||||
isChargedUp = true;
|
||||
// Visual effect for charged state
|
||||
if (spriteRenderer != null)
|
||||
{
|
||||
spriteRenderer.color = Color.red; // Glow red when charged
|
||||
}
|
||||
ModAPI.Notify("SledgeHammer CHARGED!");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// Reset charge when not held
|
||||
if (isChargedUp)
|
||||
{
|
||||
isChargedUp = false;
|
||||
if (spriteRenderer != null)
|
||||
{
|
||||
spriteRenderer.color = originalColor; // Return to normal color
|
||||
}
|
||||
}
|
||||
chargeStartTime = Time.time;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void Start()
|
||||
{
|
||||
// Add a subtle glow effect when spawned
|
||||
if (spriteRenderer != null)
|
||||
{
|
||||
try
|
||||
{
|
||||
var brightMaterial = ModAPI.FindMaterial("VeryBright");
|
||||
if (brightMaterial != null)
|
||||
{
|
||||
spriteRenderer.material = brightMaterial;
|
||||
}
|
||||
}
|
||||
catch (System.Exception ex)
|
||||
{
|
||||
Debug.LogWarning($"Failed to set bright material: {ex.Message}");
|
||||
}
|
||||
}
|
||||
|
||||
// Initialize timing variables
|
||||
lastImpactTime = Time.time;
|
||||
chargeStartTime = Time.time;
|
||||
|
||||
ModAPI.Notify("Enhanced SledgeHammer Ready!");
|
||||
}
|
||||
|
||||
private void OnDestroy()
|
||||
{
|
||||
// Clean up effects
|
||||
if (spriteRenderer != null)
|
||||
{
|
||||
spriteRenderer.color = originalColor;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
BIN
mods/SledgeHammer-Enhanced/sledgeHammer.png
Normal file
BIN
mods/SledgeHammer-Enhanced/sledgeHammer.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 12 KiB |
BIN
mods/SledgeHammer-Enhanced/sledgeHammerView.png
Normal file
BIN
mods/SledgeHammer-Enhanced/sledgeHammerView.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 12 KiB |
BIN
mods/SledgeHammer-Enhanced/thumb.png
Normal file
BIN
mods/SledgeHammer-Enhanced/thumb.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 240 KiB |
Reference in New Issue
Block a user