CCG Toolkit | Multiplayer Card Game Framework

In case anyone is looking for Taunt implementations, I just did one today which I think it pretty simple. Prototype advised checking for Active Taunt Cards at the point of card interaction and that’s exactly what I’ve done. First make an ability called Taunt (essentially just an event which unhides my taunt visual feedback). Then put in some logic in both Player Controller and AI Controller. I’ve put the comments on the images which should explain it.

Thanks dude, that worked. I haven’t got the AI using it yet but I’ll look at that soon.

Wish all your opponents, friends, and family a Happy Holidays by sending there way an affordable Seasonal Holiday card wishing them strength and health.

The CCG Toolkit is 50% OFF! for the Marketplace Holiday Sale!

Pick it up for the this discounted price before the December 31st. Happy Dev-ing!

Hi, could you explain a bit how the Multiplayer works? I am looking to make the multiplayer using the Steam platform.
Is that possible?
Or maybe using GameSparks.

I did not find much related to Multiplayer setup in the documentation PDF.

Thanks

Thanks but you could detail it more, it would be very useful, greetings.

They could help me make a kind of flying creature like in magic, only the flying cards can attack each other, but they attack all.

Multiplier is based on the Unreal’s Multiplayer/Networking/Replication framework so nothing is particularly “unique” in the toolkit that you will need to worry about. With the correct setup, steam should be easy enough to enable following one of the available tutorials. I haven’t been able to really look at gamesparks but from my understanding they don’t use much of unreals multiplayer service, so you will need to setup your project differently to call RPC events and replication through the Gamesparks API.

As mentioned, Steam should be supported out of the box once you enable this in your project.

If your looking to restrict which types of cards can interact with others, there are already a few examples setup in the card data which says whether or not cards can only attack the board player OR other cards on the board. These are setup as bools, but If you want to specify a range of different card types then you can add a card type enum array to the card struct and then when the interaction occurs in the “Deal Damage to Card” function (Interactions Function Library you can check the receiving card to see whether or not its found in the valid interactions array in the card data.

Hi. What’s the easiest way of removing card sets/Arenas? I just want to include my new content.

Cheers, and happy new year!

  1. Create an ability called Taunt in the “CardAbility_FunctionLibrary”. The function doesn’t do anything except unhide feedback on the 3d Card.

  2. Create the filter by Taunt function in the “ArrayFilters_FunctionLibrary”. This function checks for any active opponent 3d Card which has taunt.

3/4. Add a section to the “RunCardInteraction” function in the “CardGamePlayerController” and “CardGameAIController”.

  1. Add the new Taunt ability to a card which stays out on the board. My ability triggers “On Drop” and just unhides the Taunt feedback. Both human and AI players must attack an enemy taunt card before any other stargets can be attacked.

Hope this helps.

Easiest way would be to Remove the Card Set from the “Game/CCGToolkit/Blueprints/Enums/Gameplay_Enums/CardSet_Enum” This will break any links in most places around the toolkit including the data table references in the GetCardData function where they would have originally been added.

As for Arenas, the same dealio. Remove the unwanted Arenas from the “Game/CCGToolkit/Blueprints/Enums/Menu_Enums/ArenaList_Enum”.

Both of these will stop the content from being accessible in-game, but the content will still be available. If you want to completely remove the content aswell, then you will have to follow the above steps then go into the card sets and delete the data table and content, and for Arenas you can go into the maps folder and delete the unwanted level files.

Happy New Year!

Cheers dude.

Hey, sorry for the rapid fire questions. I’m working full time on it :).

I’m trying to implement a new card play condition, for a human Players only. I want to use the HitActor reference in CardGamePlayerController to provide a reference to a 3DCard actor which will be the target of an OnDropped ability for a spell type card. The conditon I have made is called PlayOnSelectedUnit (you can see it below). My problem only occurs in multiplayer (vs another human). It appears that both my client and host reference CardGamePlayerController_0. HitActor is empty for one Player (depending on who started the game).

In order to test I set a continuously print screen for Controller object name / Hit actor. This is the readout.

Client1: CardGamePlayerController_C_0 / HitActor: None
Server: CardGamePlayerController_C_1 / HitActor: None
Server: CardGamePlayerController_C_0 / HitActor: None

Both of the CardGamePlayerController_C_0 update correctly with the HitActor. However, I’m assuming that in the ValidateCardPlayConditions inside the Serverside PlayCard function wants to useit’s own reference for CardGamePlayerController_C_1 and it’s HitActor.

Any ideas?

All good! In most cases if your server player controller (What the abilities would be referencing) is returning Null, then it could be 1 of two things.

  1. The first would be that the reference Is not being set, or its being set and cleared.
  2. The reference is being set on the client, which will not replicate to the server. And/or the server is replicating its Null reference when you’ve set it on the server.

The ValidateCardPlayConditions function gets the server controller passed though so my feeling is on point 2, where the Hit actor may be getting set on the client. You can either pass through the reference to the actor you want to set to the server OR you can retrace on the server to get the reference and set this in the Play Card function.

Send over some screenshots of where your setting the reference if you want, and Ill take a look to see if anything stands out.

Thank dude, I solved it. I don’t think I was using the replicated variables properly. I ended up creating a replicated event which passed the HitActor reference and set it.

Wondering if this has been addressed before. Having animations or vid files playing after an attack or buff, etc. The data tables include particles and sounds but any advice on implementing either animations or vid files?

Hey Canthitcrap, Ive had a few quick tests to see how this could be done.

For videos, you should be able to add a “File Media Source” type variable to your card struct (or sub-struct) which then will become available in your data table to assign per card. You can then reference a media (video) file and use this when you want to in the data table.

The same thing should work for the animation files.

Both solutions may have other more suitable option depending on what your after and how unique the animations/videos will be, but at least this should get your started.

Hello, i just wanted to ask if there are more updates coming or if 1.2 was pretty much the final release. Thanks.

Hey ScarfaceTheDuke!

At this stage the toolkit is feature complete at v1.2.

Many features that would be added are available as other great marketplace products already, but If the product picks up and I see additional value in adding other unique features, this may also on the cards.

The hover time before enlargement (i.e. when the card is in my hand or in a CardPlacement) is too long for my liking. Where can I shorten this? Thanks!

Hey WakaFlockaFlam2!

You can go into the CardWidget blueprint and in the main event graph and on the right column you will find the “On Mouse Enter” event. There is a 0.2 second delay here which you can shorten to something that works better for you.