Page 2 of 3

Re: Parachute!

Posted: Tue Jan 24, 2017 12:19 am
by L'In20Cible
Remove the info part.

Re: Parachute!

Posted: Tue Jan 24, 2017 8:11 am
by Painkiller
Ok i have, but now come this.

Syntax: Select all

09:10:17 [SP] Loading plugin 'parachute'...

[SP] Caught an Exception:
Traceback (most recent call last):
File "../addons/source-python/packages/source-python/plugins/command.py", line 162, in load_plugin
plugin = self.manager.load(plugin_name)
File "../addons/source-python/packages/source-python/plugins/manager.py", line 174, in load
plugin._load()
File "../addons/source-python/packages/source-python/plugins/instance.py", line 67, in _load
self.module = import_module(self.import_name)
File "../addons/source-python/plugins/parachute/parachute.py", line 48, in <module>
configuration = ConfigManager(informations.basename)

NameError: name 'informations' is not defined


[SP] Plugin 'parachute' was unable to be loaded.

Re: Parachute!

Posted: Tue Jan 24, 2017 8:17 am
by L'In20Cible
Replace all occurences of informations.basename with 'parachute'.

Re: Parachute!

Posted: Tue Oct 03, 2017 10:01 am
by Painkiller
Hii have find an error.

Code: Select all

[SP] Loading plugin 'parachute'...

[SP] Caught an Exception:
Traceback (most recent call last):
  File "../addons/source-python/packages/source-python/plugins/command.py", line 162, in load_plugin
    plugin = self.manager.load(plugin_name)
  File "../addons/source-python/packages/source-python/plugins/manager.py", line 193, in load
    plugin._load()
  File "../addons/source-python/packages/source-python/plugins/instance.py", line 74, in _load
    self.module = import_module(self.import_name)
  File "../addons/source-python/plugins/parachute/parachute.py", line 67, in <module>
    with open(CFG_PATH / 'parachute' / 'precache.res') as f:

FileNotFoundError: [Errno 2] No such file or directory: Path('../cfg/source-python/parachute/precache.res')


[SP] Plugin 'parachute' was unable to be loaded.

Re: Parachute!

Posted: Tue Oct 03, 2017 10:51 am
by Ayuto
Looks like you are using this version, but didn't fully installed it...:
viewtopic.php?p=9047#p9047

Re: Parachute!

Posted: Wed Oct 04, 2017 4:42 am
by L'In20Cible
Like Ayuto said, you didn't install it correctly. The traceback you posted clearly tells you that you are missing a file:

Code: Select all

FileNotFoundError: [Errno 2] No such file or directory: Path('../cfg/source-python/parachute/precache.res')

Re: Parachute!

Posted: Wed Oct 04, 2017 5:03 am
by iPlayer
Well, the plugin needed to be updated, too (due to the PluginInfo changes - it hasn't been updated since then)

Here's the new version

Syntax: Select all

# ../addons/source-python/plugins/parachute/parachute.py


# ============================================================================
# >> IMPORTS
# ============================================================================
# Python Imports
from random import choice

# Source.Python Imports
from cvars import ConVarFlags
from entities.constants import MoveType
from paths import CFG_PATH
from players.constants import PlayerStates
from players.constants import PlayerButtons

from mathlib import Vector
# Config
from config.manager import ConfigManager
# Core
from core import echo_console
# ConVars
from cvars import ConVar
# Models
from engines.precache import Model
# Entities
from entities.entity import Entity
# Events
from events import Event
# Filters
from filters.players import PlayerIter
# Messages
from messages import HintText
# Players
from players.entity import Player
# Plugins
from plugins.info import PluginInfo
from plugins.manager import plugin_manager
# Tick
from listeners import OnTick
from listeners.tick import Delay
# Stringtables
from stringtables.downloads import Downloadables
# Translations
from translations.strings import LangStrings


# ============================================================================
# >> INFORMATIONS
# ============================================================================
info = plugin_manager.get_plugin_info(__name__)


# ============================================================================
# >> GLOBAL VARIABLES
# ============================================================================
# Create and execute the configuration file...
configuration = ConfigManager(info.name)
parachute_advert = configuration.cvar('parachute_advert', '1',
description='Enable/Disable the advert every round start.')
parachute_button = configuration.cvar('parachute_button', 'SPEED',
description='Defines the button to use the parachute.')
parachute_falling_speed = configuration.cvar('parachute_falling_speed', '10',
description='Defines the falling speed of the parachute.')
configuration.write()
configuration.execute()

# Parse the translations files...
translations = LangStrings(info.name)

# Get a global HintText...
advert = HintText(message=translations['Advert'])


# Parse precache.res
models = []
with open(CFG_PATH / info.name / 'precache.res') as f:
for line in f:
line = line.strip()
if not line:
continue
models.append(Model(line))

# Parse downloadables.res
downloadables = Downloadables()
with open(CFG_PATH / info.name / 'downloadables.res') as f:
for line in f:
line = line.strip()
if not line:
continue
downloadables.add(line)

parachutes = {}


# ============================================================================
# >> FUNCTIONS
# ============================================================================
def open_parachute(player):
parachute = Entity.create('prop_dynamic_override')
parachutes[player.userid] = (player, parachute)

parachute.model = choice(models)
parachute.teleport(player.origin, player.angles, None)
parachute.spawn()


def close_parachute(player):
parachutes.pop(player.userid)[1].remove()


# ============================================================================
# >> LISTENER CALLBACKS
# ============================================================================
@OnTick
def tick_listener():
'''Fired each game frame...'''

try:
# Teleport existing parachutes to their owners
for player, parachute in parachutes.values():
parachute.teleport(player.origin, player.angles, None)

# Loop through all living, human players...
for player in PlayerIter(is_filters=['alive'], not_filters=['bot']):

# Is the player not falling?
if (player.fall_velocity < 1.0 or

# Is the player not holding his parachute key?
not player.buttons & getattr(PlayerButtons,
parachute_button.get_string().upper()) or

# Is the player currently in a ladder?
player.move_type & MoveType.LADDER or

# Is the player currently in water?
player.flags & PlayerStates.INWATER):

if player.userid in parachutes:
close_parachute(player)

continue

# Revert the falling velocity to slow down the player speed...
player.base_velocity = Vector(
0,
0,
player.fall_velocity + (
parachute_falling_speed.get_float() * -1)
)

if player.userid not in parachutes:
open_parachute(player)

except Exception as e:
echo_console(str(e))


# ============================================================================
# >> GAME EVENTS
# ============================================================================
@Event('round_start')
def round_start(game_event):
'''Fired at the beginning of every round...'''

# Clear entities list
parachutes.clear()

# Is the advert disabled?
if not parachute_advert.get_bool():

# No need to go further...
return

# Send the advert...
# NOTE: Since ResetHud is sent every round, we need to wait a bit before
# sending a HintText message...
Delay(0.5, advert.send,
kwargs={'button': parachute_button.get_string().lower()})


Here's info.ini:

Syntax: Select all

verbose_name = "Parachute"
author = "L'In20Cible, iPlayer"
description = "You know..."
version = "1.0"


This plugin desperately needs a repo.

Re: Parachute!

Posted: Sat Oct 14, 2017 10:17 pm
by L'In20Cible


  • Optimizations.
  • New mechanic: Steering lines!
  • New model for OrangeBox and CS:GO engines.
  • Cheap "scaling" animation to simulate the deployment of the parachute.
  • Parachute parenting for movement prediction.

Re: Parachute v0.02!

Posted: Sat Dec 02, 2017 6:55 pm
by satoon101
This works great on Windows, but I'm experiencing a crash on Linux. I have narrowed down the crash to line 145:

Syntax: Select all

parachute.parent = weapon


Output of "sp info":

Code: Select all

Date          : 2017-12-02 18:54:00.610238
OS            : Linux-3.14.1-ub-100hz-x86_64-with-debian-7.11
Game          : css
SP version    : 621
Server plugins:
   00: Source.Python, (C) 2012-2016, Source.Python Team.
SP plugins:
   00: gungame, 1.1.1, https://forums.sourcepython.com/viewtopic.php?t=1621
   01: map_config
   02: parachute, 0.02, https://forums.sourcepython.com/viewtopic.php?f=7&p=10736#p10736

Re: Parachute v0.02!

Posted: Sun Dec 03, 2017 1:24 am
by L'In20Cible
Interesting. Does the Entity.set_parent call itself crash on Linux, or only when you parent to a carried weapon? Does the following also crashes?

Syntax: Select all

parachute.call_input('SetParent', '!activator', activator=weapon)

Re: Parachute v0.02!

Posted: Sun Dec 03, 2017 1:42 am
by satoon101
L'In20Cible wrote:Interesting. Does the Entity.set_parent call itself crash on Linux, or only when you parent to a carried weapon?

I use Entity.set_parent in multi_level, and that seems to function correctly.


L'In20Cible wrote:Does the following also crashes?

Syntax: Select all

parachute.call_input('SetParent', '!activator', activator=weapon)

This also crashes, unfortunately.

Re: Parachute v0.02!

Posted: Sun Dec 03, 2017 1:54 am
by L'In20Cible
Hmm. What if you move it after the spawn() call?

Re: Parachute v0.02!

Posted: Sun Dec 03, 2017 2:39 am
by satoon101
L'In20Cible wrote:Hmm. What if you move it after the spawn() call?

When I did that, it crashed on setting the model. I moved both down, and it crashed on either of those 2 depending on the order I had them after spawn().

Re: Parachute v0.02!

Posted: Sun Dec 03, 2017 2:45 am
by L'In20Cible
EDIT: Actually, this is probably because set_parent and call_input are both dynamically calling a function which is most likely related to issue #157.

Re: Parachute v0.02!

Posted: Sun Dec 03, 2017 4:09 am
by L'In20Cible
The following should do it, I guess:

Syntax: Select all

# ../addons/source-python/plugins/parachute/parachute.py

# ============================================================================
# >> IMPORTS
# ============================================================================
# Python Imports
# Math
from math import cos
from math import radians
from math import sin

# Source.Python Imports
# Core
from core import SOURCE_ENGINE
# Engines
from engines.precache import Model
# Entities
from entities.constants import MoveType
from entities.entity import Entity
# Listeners
from listeners import OnPlayerRunCommand
from listeners.tick import Delay
# Mathlib
from mathlib import Vector
# Paths
from paths import GAME_PATH
# Players
from players.constants import PlayerButtons
from players.constants import PlayerStates
from players.entity import Player
from players.dictionary import EntityDictionary
# Stringtables
from stringtables.downloads import Downloadables


# ============================================================================
# >> CONFIGURATION
# ============================================================================
# Define the falling speed in units/s. The higher this value is, the
# faster parachutists will fall.
falling_speed = 32

# Define the speed of the steering lines in units/s. To pull a steering line,
# parachutists must use their A or D keys to gain speed into the right or left
# direction allowing them to have a better control of their landing. However,
# pulling a line come with a falling speed cost.
#
# Set to 0 to disable the ability to pull a line.
steering_lines_speed = 5

# Define the falling speed penalty multiplier when pulling a line.
# e.g. With a falling speed of 32 and a penalty of 1.5, parachutists pulling
# their lines would fall at a speed of 48 units/s.
#
# Set to 1 to disable the falling speed penalty.
steering_lines_penalty = 1.5

# Define the key players must hold to deploy their parachute.
deployment_button = PlayerButtons.SPEED


# ============================================================================
# >> GLOBALS
# ============================================================================
downloadables = Downloadables()
downloadables.add_directory(f'models/parachute/{SOURCE_ENGINE}')
downloadables.add_directory('materials/models/parachute')

parachutes = EntityDictionary()

_path = f'models/parachute/{SOURCE_ENGINE}/parachute_default.mdl'
if not (GAME_PATH / _path).isfile():
parachute_model = None
else:
parachute_model = Model(_path)


# ============================================================================
# >> FUNCTIONS
# ============================================================================
def get_player_parachute(player):
for parachute in parachutes.values():
if parachute.owner_handle != player.inthandle:
continue
return parachute


def close_parachute(player):
parachute = get_player_parachute(player)
if parachute is None:
return
parachute.remove()


# ============================================================================
# >> LISTENERS
# ============================================================================
@OnPlayerRunCommand
def _on_player_run_command(player, usercmd):
if player.is_bot():
return

if (player.dead or
player.move_type == MoveType.LADDER or
player.flags & PlayerStates.INWATER or
not usercmd.buttons & deployment_button):

close_parachute(player)
return

fall_velocity = player.fall_velocity
if fall_velocity < 1.0:
close_parachute(player)
return

side_move = usercmd.side_move
if side_move and steering_lines_speed > 1:
yaw = player.eye_angle.y

if side_move < 0:
yaw += 90
else:
yaw -= 90
yaw = radians(yaw)

vec = Vector(
x=cos(yaw) * steering_lines_speed,
y=sin(yaw) * steering_lines_speed,
z=fall_velocity + -(falling_speed * steering_lines_penalty))
else:
vec = Vector(z=fall_velocity + -falling_speed)

player.base_velocity = vec

if parachute_model is None:
return

Delay(0, parachute_check, (player,))

def parachute_check(player):
angles = Vector(y=player.eye_angle.y)
parachute = get_player_parachute(player)
if parachute is None:
parachute = Entity.create('prop_dynamic_override')
parachutes[parachute.index] = parachute

weapon = player.active_weapon
if weapon is not None:
parachute.parent = weapon

parachute.model = parachute_model
parachute.owner_handle = player.inthandle
parachute.origin = player.origin
parachute.angles = angles
parachute.model_scale = 0.7

parachute.spawn()
return

weapon = player.active_weapon
if weapon is not None:
parent = parachute.parent
if parent != weapon:
parachute.parent = weapon

origin = player.origin
else:
parachute.parent = None
view_offset = player.view_offset.copy()
view_offset.z /= 2
origin = player.origin + view_offset

parachute.origin = origin
parachute.angles = angles

if parachute.model_scale >= 1.0:
return

parachute.model_scale += 0.024

Re: Parachute v0.02!

Posted: Sun Dec 03, 2017 4:39 am
by satoon101
That works!

I'm having an issue with my server when it comes to models, so it just shows the big red error, but it does work. The model error has nothing to do with this plugin, so if I can't figure it out, I'll start a new thread.

Thank you!

Re: Parachute v0.02!

Posted: Sun Dec 03, 2017 5:10 am
by L'In20Cible
If you see error models, that means your client didn't download the models. This can be caused by the server being unable to push the files because it doesn't have the correct permissions for the models/materials folders and cannot generate the ztmp files. This can also be caused by your client ignoring downloadables (cl_downloadfilter).

Re: Parachute v0.03!

Posted: Sun Dec 03, 2017 5:29 am
by L'In20Cible
I've just updated to v0.03 which adds the delay workaround. I recommend it over the code I posted above because it use Player.delay which will ensure the delay is tracked and cancelled if needed (should not matters, but just to be safe ;)).

Re: Parachute v0.03!

Posted: Fri Jan 12, 2018 5:59 pm
by Painkiller
No longer work for BMS


Code: Select all

[SP] Loading plugin 'parachute'...

[SP] Caught an Exception:
Traceback (most recent call last):
  File "../addons/source-python/packages/source-python/plugins/command.py", line 162, in load_plugin
    plugin = self.manager.load(plugin_name)
  File "../addons/source-python/packages/source-python/plugins/manager.py", line 193, in load
    plugin._load()
  File "../addons/source-python/packages/source-python/plugins/instance.py", line 74, in _load
    self.module = import_module(self.import_name)
  File "../addons/source-python/plugins/parachute/parachute.py", line 65, in <module>
    downloadables.add_directory(f'models/parachute/{SOURCE_ENGINE}')
  File "../addons/source-python/packages/source-python/stringtables/downloads.py", line 65, in add_directory
    for index, file in enumerate(GAME_PATH.joinpath(directory).walkfiles(), 1):
  File "../addons/source-python/packages/site-packages/path.py", line 665, in walkfiles
    childList = self.listdir()
  File "../addons/source-python/packages/site-packages/path.py", line 532, in listdir
    for child in map(self._always_unicode, os.listdir(self))

FileNotFoundError: [Errno 2] No such file or directory: Path('../models/parachute/bms')


[SP] Plugin 'parachute' was unable to be loaded.

Re: Parachute v0.03!

Posted: Sun Jan 28, 2018 12:28 pm
by Kill
Painkiller wrote:No longer work for BMS


Code: Select all

[SP] Loading plugin 'parachute'...

[SP] Caught an Exception:
Traceback (most recent call last):
  File "../addons/source-python/packages/source-python/plugins/command.py", line 162, in load_plugin
    plugin = self.manager.load(plugin_name)
  File "../addons/source-python/packages/source-python/plugins/manager.py", line 193, in load
    plugin._load()
  File "../addons/source-python/packages/source-python/plugins/instance.py", line 74, in _load
    self.module = import_module(self.import_name)
  File "../addons/source-python/plugins/parachute/parachute.py", line 65, in <module>
    downloadables.add_directory(f'models/parachute/{SOURCE_ENGINE}')
  File "../addons/source-python/packages/source-python/stringtables/downloads.py", line 65, in add_directory
    for index, file in enumerate(GAME_PATH.joinpath(directory).walkfiles(), 1):
  File "../addons/source-python/packages/site-packages/path.py", line 665, in walkfiles
    childList = self.listdir()
  File "../addons/source-python/packages/site-packages/path.py", line 532, in listdir
    for child in map(self._always_unicode, os.listdir(self))

FileNotFoundError: [Errno 2] No such file or directory: Path('../models/parachute/bms')


[SP] Plugin 'parachute' was unable to be loaded.



Download the models files.