I'm currently making a survival game in Ursina Engine but somewhere in development I did something and now this error is spamming my console.
I literally can't see anything in the console because it appears its sending this error every frame and I want to know what is causing the error.
Error: Assertion failed: _error_type == ET_ok at line 601 of panda/src/pgraph/nodePath.cxx
from typing import TypedDict, Any, TypeVar
from direct.stdpy.threading import Thread
from ursina import * # pyright: ignore[reportWildcardImportFromLibrary]
from ursina.prefabs.first_person_controller import (
FirstPersonController,
InputField,
Text,
WindowPanel,
)
from ursina.prefabs.health_bar import HealthBar
from ursina.prefabs.ursfx import ursfx
from ursina.shaders import lit_with_shadows_shader
class PlayerData(TypedDict):
attack_damage: int
level: int
xp: int
next_xp: int
SOUND_EFFECTS: dict[str, str] = {
"cant": 'ursfx([(0.0, 1.0), (0.12, 0.5), (0.25, 0.5), (0.37, 0.5), (1.0, 0.0)], volume=1.0, wave="sine", pitch=-13, speed=2.9)', # basically like, "hey you can't do this"
"heal": 'ursfx([(0.0, 0.13), (0.1, 0.07), (0.25, 0.1), (0.37, 0.08), (1.0, 0.0)], volume=1.0, wave="triangle", speed=4.0)', # every time player heals naturally
"hurt": 'ursfx([(0.0, 1.0), (0.09, 1.0), (0.26, 1.0), (0.31, 1.0), (0.38, 1.0)], volume=0.13, wave="noise", pitch=-25, speed=3.1)', # every time player takes damage
}
XP_INCREMENT = 12
app = Ursina()
playerController = FirstPersonController(y=2, origin_y=0.5)
healthText = Text("Health (100%)", y=-0.45, x=-0.75)
hungerText = Text("Hunger (100%)", y=-0.4, x=-0.75)
playerHealthBar = HealthBar(y=-0.45, x=-0.55)
playerHungerBar = HealthBar(bar_color=color.orange, y=-0.4, x=-0.55)
playerData: PlayerData = {
"attack_damage": 5,
"level": 1,
"next_xp": 100,
"xp": 0,
}
expectedEnemyHealthbarPosition = 0.5
T = TypeVar("T")
class Datastore:
def __init__(self, name: str):
self.name = name
self.store = {}
def set(self, key: Any, value: T | Any):
self.store[key] = value
def get(self, key: Any) -> T | Any:
return self.store[key]
def increase(self, key: Any, by: int | float, default: int | float = 0):
if not self.store.get(key):
self.store[key] = default
self.store[key] += by
def decrease(self, key: Any, by: int | float, default: int | float = 0):
if not self.store.get(key):
self.store[key] = default
self.store[key] -= by
class Enemy(Entity):
def __init__(
self,
name: str = "cube enemy :)",
add_to_scene_entities=True,
destroy_on_death: bool = True,
assign_player: PlayerData = playerData,
informational_messages: bool = False,
damages_player: bool = True,
**kwargs,
):
global expectedEnemyHealthbarPosition
super().__init__(
add_to_scene_entities, shader=lit_with_shadows_shader, **kwargs
)
expectedEnemyHealthbarPosition -= 0.05
self.health_bar = HealthBar()
self.health_bar.text = name
self.health_bar.y = expectedEnemyHealthbarPosition
self.destroy_on_death = destroy_on_death
self.player = assign_player
self.informational_messages = informational_messages
self.damages_player = damages_player
self.timer = 0
self.cooldown_timer = 0
def on_click(self):
"""
it isn't recommended to overwrite this function unless you know what you're doing
"""
if self.cooldown_timer > 0:
return
if distance(self, playerController) > 4.89:
if self.informational_messages:
print("too far to hit")
return
eval(SOUND_EFFECTS["hurt"])
self.cooldown_timer = 20
self.health_bar.value -= self.player["attack_damage"]
# print("ow")
if self.health_bar.value < 1:
if self.destroy_on_death:
destroy(self)
destroy(self.health_bar)
self.on_death()
def on_death(self): # hopefully if not overwritten
if self.informational_messages:
print("oh no :(")
def update(self):
self.timer += 1
if self.timer >= 20:
self.timer = 0
if self.damages_player and distance(self, playerController) < 2:
playerHealthBar.value -= 5
if self.cooldown_timer > 0:
self.cooldown_timer -= 1
test_enemy = Enemy(model="cube", y=1, collider="box", x=-4)
tree = Enemy(
model="JustATree",
damages_player=False,
name="Tree",
y=1,
collider="mesh",
color=color.green,
rotation_x=180,
z=-6,
)
plane = Entity(model="plane", collider="box", texture="grass", scale=(100, 1, 100))
pivot = Entity()
DirectionalLight(
parent=pivot, y=5, z=3, shadows=True, model="cube", rotation=(90, 0, 0)
)
ALLOW_NUMBERS = "-0123456789"
DEBUG_MENU = {
"jetpackField": InputField("1", limit_content_to=ALLOW_NUMBERS),
"attackField": InputField("5", limit_content_to=ALLOW_NUMBERS),
}
def _ifh1():
if DEBUG_MENU["attackField"].text == "" or DEBUG_MENU["attackField"].text == "-":
t = 0
else:
t = int(DEBUG_MENU["attackField"].text)
playerData["attack_damage"] = t
DEBUG_MENU[
"attackField"
].on_value_changed = _ifh1 # pyright: ignore[reportGeneralTypeIssues]
debugPanel = WindowPanel(
"Debug Menu",
content=[
Text("Jetpack Strength"),
DEBUG_MENU["jetpackField"],
Text("Player Attack Damage"),
DEBUG_MENU["attackField"],
],
enabled=False,
)
timer = 0
isJetpackEnabled = False
jetpackDirection = False # False = down, True = up
TICK_UPDATE_DELAY = 0.2
def updateTick():
while True:
healthText.text = f"Health ({round((playerHealthBar.value / playerHealthBar.max_value) * 100, 2)}%)"
hungerText.text = f"Hunger ({round((playerHungerBar.value / playerHungerBar.max_value) * 100, 2)}%)"
time.sleep(TICK_UPDATE_DELAY)
def update():
global timer, isJetpackEnabled
if timer > 0:
timer -= 1
elif timer == 0:
isJetpackEnabled = False
if isJetpackEnabled:
if DEBUG_MENU["jetpackField"].text == "":
DEBUG_MENU["jetpackField"].text = "0"
match jetpackDirection:
case False:
playerController.y -= int(DEBUG_MENU["jetpackField"].text)
case True:
playerController.y += int(DEBUG_MENU["jetpackField"].text)
def input(key: str):
global isJetpackEnabled, jetpackDirection, timer
print(key)
if key == "q" or key == "q hold":
isJetpackEnabled = True
jetpackDirection = False
timer = 10
if key == "e" or key == "e hold":
isJetpackEnabled = True
jetpackDirection = True
timer = 10
if key == "f4":
playerController.enabled = not playerController.enabled
debugPanel.enabled = not debugPanel.enabled
app.run()
tickingThread = Thread(target=updateTick)
tickingThread.start()
I tried to remove some models but that didn't do anything